أمس في ١٨:٤٦
صاحب الموضوع
PHP Login Rate Limit Kurulumu
Güvenli bir web uygulaması geliştirmek, yalnızca kullanıcı doğrulama işlemini doğru yapmakla kalmaz, aynı zamanda kaba kuvvet saldırılarını engellemek için giriş denemelerini sınırlandırmak da kritik bir adımdır. PHP'de bu tip sınırlamaları uygularken, genellikle oturum (session), dosya veya veritabanı kullanılır. En yaygın ve etkili yöntem, IP adresine veya kullanıcıya göre deneme sayısını takip edip, belli bir limit aşıldığında erişimi engellemektir.
İlk olarak, giriş denemelerini takip etmek için basitçe bir dosya veya PHP session kullanabiliriz. Ancak, yüksek trafik ve güvenlik açısından, çoğu zaman veritabanı veya Redis gibi hızlı önbellek çözümleri tercih edilir. Örneğin, IP bazlı sınırlandırma yaparken, şu adımları izleyebiliriz:
- Kullanıcıdan gelen IP adresini almak:
[/li]
CODE:
1$ip = $_SERVER['REMOTE_ADDR'];
- IP ve zaman damgasıyla giriş deneme sayısını takip eden bir yapıyı oluşturmak (örneğin, veritabanı veya Redis). Bu yapı, IP'ye göre giriş sayısı ve ilk deneme zamanı kaydeder.
- Her giriş denemesinden sonra, bu sayıyı güncellemek ve limit aşıldığında erişimi engellemek. Örneğin, 5 deneme limit ve 15 dakika içinde bu limit aşıldığında, giriş denemesine izin vermek.
Basitçe, PHP ve dosya sistemi kullanarak bir örnek yapı şu şekilde olabilir:
// Dosya tabanlı örnek, sadece küçük projeler veya test amaçlı uygundur.
$limit = 5;
$window = 15 * 60; // 15 dakika
$ip = $_SERVER['REMOTE_ADDR'];
$file = sys_get_temp_dir() . "/login_attempts_" . md5($ip);
$attempts = file_exists($file) ? json_decode(file_get_contents($file), true) : ['count' => 0, 'first_attempt' => time()];
if(time() - $attempts['first_attempt'] > $window) {
// Süre aşılmışsa sıfırla
$attempts = ['count' => 0, 'first_attempt' => time()];
}
if($attempts['count'] >= $limit) {
die("Çok fazla giriş denemesi. Lütfen biraz sonra tekrar deneyin.");
}
// Giriş denemesi başarılıysa veya başarısızsa sayacı artır
// Bu noktada giriş işlemini gerçekleştirin ve başarısız ise:
$attempts['count'] += 1;
file_put_contents($file, json_encode($attempts));
Elbette, bu yöntem basit ve küçük projeler içindir. Daha gelişmiş ve güvenilir çözümler için, Redis veya memcached kullanımı önerilir çünkü bu çözümler yüksek hız ve düşük gecikme sağlar. Ayrıca, IP yerine kullanıcı hesabı veya token bazlı limitler de uygulanabilir.
Güvenlik ve kullanıcı deneyimini dengelemek adına, giriş sınırlarını aşan kullanıcılar için CAPTCHA veya ek doğrulama adımları entegre etmek de faydalı olur.
Sonuç olarak, rate limiting uygulaması, kaba kuvvet saldırılarına karşı ilk ve önemli savunma hattıdır ve PHP’de doğru yapılandırıldığında sisteminizi ciddi anlamda koruyabilir.