Kimlik Doğrulama ve Yetkilendirme Stratejileri
İlk savunma hattı, yalnızca yasal kullanıcıların ve hizmetlerin kaynaklarınıza erişmesini sağlamaktır. Temel Kimlik Doğrulama uygulamak basit olsa da, TLS ile eşleştirilmediğinde kök arama saldırılarına karşı savunmasız olması nedeniyle modern web uygulamaları için temelde güvensizdir. Bunun yerine, endüstri standartları token tabanlı kimlik doğrulama mekanizmalarını tercih etmektedir. JSON Web Token'ları (JWT), durum bilgisi gerektirmeyen kimlik doğrulama için varsayılan standart haline gelmiştir. JWT'leri uygularken, "none" algoritmalarına veya zayıf HMAC anahtarlarına güvenmek yerine güçlü imza algoritmalarının (örneğin RS256) uygulanması hayati önem taşır. Ayrıca, En Az Ayrıcalık İlkesini sağlamak için yetkilendirme Rol Tabanlı Erişim Kontrolü (RBAC) veya Nitelik Tabanlı Erişim Kontrolü (ABAC) aracılığıyla ele alınmalıdır.OAuth2 akışınızı tasarlarken, yetkilendirme kodu engelleme saldırılarını önlemek için herkese açık istemcilerde her zaman PKCE (Kod Değişimi İçin Kanıt Anahtarı) ile Yetkilendirme Kodu Grant akışını kullanın. Erişim token'larını URL parçasında açığa çıkardığı için Varsayılan Grant akışından tamamen kaçının.
Giriş Doğrulama ve Çıkış Kodlama
Kötü niyetli girişler, SQL Enjeksiyonu (SQLi) ve Çapraz Site Komut Dosyası (XSS) dahil olmak üzere enjeksiyon saldırıları için birincil vektördür. Bu riskleri azaltmak için istemci tarafı verilerine asla güvenmemelisiniz. İşlenmeden önce gelen tüm veriler sıkı bir şemaya göre doğrulanmalıdır. Sağlam bir doğrulama kütüphanesi kullanmak, veri türlerinin, uzunluklarının ve formatlarının beklentilerinizi karşıladığını sağlar. Örneğin, bir uç nokta bir tamsayı kimliği bekliyorsa, string girdileri hemen reddetmelidir. Ayrıca, yanıtlarda render edilen tüm dinamik veriler, XSS saldırılarını önlemek için doğru şekilde kodlanmalıdır.
// Node.js'de Zod kullanarak sıkı giriş doğrulama örneği
const userSchema = z.object({
email: z.string().email(),
age: z.number().int().positive().max(120),
role: z.enum(['admin', 'user', 'guest'])
});
app.post('/register', (req, res) => {
try {
const validatedData = userSchema.parse(req.body);
// Doğrulanmış verileri işleyin...
} catch (error) {
res.status(400).json({ error: 'Geçersiz giriş verisi' });
}
});
Hız Sınırlama ve Kısıtlama
Hız sınırlaması olmadan API'niz Hizmet Reddi (DoS) saldırılarına, kök arama girişimlerine ve aşırı kaynak tüketimine karşı savunmasızdır. Hız sınırlama, bir kullanıcının veya IP adresinin belirli bir zaman diliminde yapabileceği istek sayısını kısıtlar. Hız sınırlamayı uygulama katmanında uygulamak etkilidir, ancak ağ veya kenar katmanında (CDN'ler veya API ağ geçitleri kullanarak) dağıtmak, kötü amaçlı trafiği arka uç sunucularınıza ulaşmadan önce engellediği için daha verimlidir. Yaygın stratejiler arasında sabit pencere sayaçları, kayan pencere günlükleri veya token havuzu algoritmaları yer alır.
// express-rate-limit ile Express örneği
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 dakika
max: 100, // Her IP'yi windowMs başına 100 istekle sınırlayın
message: 'Bu IP\'den çok fazla istek var, lütfen daha sonra tekrar deneyin.'
});
app.use('/api/', limiter);