Authentication Failures (Kimlik Doğrulama Hataları)
Genel Bakış
Bu güvenlik açığı, kullanıcı kimlik doğrulama ve yetkilendirme süreçlerindeki eksikliklerden kaynaklanır. Yani, kullanıcıların kimliklerinin doğru şekilde doğrulanmaması veya yetkilerinin yanlış yönetilmesi durumunda ortaya çıkar.
Yaygın Örnekler
1. Weak Password Policy (Zayıf Şifre Politikası)
Örnek: Şifre gereksinimlerinin yetersiz olması.
// Kötü örnek
function validatePassword(password) {
return password.length >= 6;
}
// İyi örnek
function validatePassword(password) {
const minLength = 8;
const hasUpperCase = /[A-Z]/.test(password);
const hasLowerCase = /[a-z]/.test(password);
const hasNumbers = /\d/.test(password);
const hasSpecialChar = /[!@#$%^&*]/.test(password);
return password.length >= minLength &&
hasUpperCase &&
hasLowerCase &&
hasNumbers &&
hasSpecialChar;
}
2. Session Management Errors (Oturum Yönetimi Hataları)
Örnek: Oturum token'larının güvenli şekilde yönetilmemesi.
// Kötü örnek
function createSession(user) {
return {
userId: user.id,
expires: Date.now() + 86400000
};
}
// İyi örnek
class SessionManager {
async createSession(user) {
const token = await this.generateSecureToken();
const session = {
userId: user.id,
token,
expires: Date.now() + 3600000,
lastActivity: Date.now()
};
await this.storeSession(session);
return token;
}
async validateSession(token) {
const session = await this.getSession(token);
if (!session) return false;
if (Date.now() > session.expires) {
await this.invalidateSession(token);
return false;
}
session.lastActivity = Date.now();
await this.updateSession(session);
return true;
}
}
Korunma Yöntemleri
- Güçlü şifre politikaları uygulayın
- Çok faktörlü kimlik doğrulama kullanın
- Oturum yönetimini güvenli hale getirin
- Başarısız giriş denemelerini sınırlayın
- Güvenli şifre sıfırlama mekanizmaları kullanın
Örnek Kod
Secure Authentication Example (Güvenli Kimlik Doğrulama Örneği)
class AuthenticationService {
constructor() {
this.maxLoginAttempts = 5;
this.lockoutDuration = 15 * 60 * 1000; // 15 dakika
}
async login(username, password) {
// Giriş denemelerini kontrol et
const attempts = await this.getLoginAttempts(username);
if (attempts >= this.maxLoginAttempts) {
throw new Error('Hesap kilitlendi');
}
// Kullanıcıyı bul
const user = await this.findUser(username);
if (!user) {
await this.incrementLoginAttempts(username);
throw new Error('Geçersiz kullanıcı adı veya şifre');
}
// Şifreyi doğrula
const isValid = await bcrypt.compare(password, user.password);
if (!isValid) {
await this.incrementLoginAttempts(username);
throw new Error('Geçersiz kullanıcı adı veya şifre');
}
// Başarılı giriş
await this.resetLoginAttempts(username);
return this.createSession(user);
}
async createSession(user) {
const session = await this.sessionManager.createSession(user);
await this.auditLogger.logLogin(user.id, true);
return session;
}
}