Bu kodun flood koruması amacına uygun çalışması için aşağıdaki değişiklikleri yapmanız gerekmektedir:
$elapsed değişkeninin hesaplanması: $flood_time değişkeninin değeri saniye cinsinden belirtilmiştir. Ancak $elapsed değişkeninin hesaplanmasında $flood_time değerinin dikkate alınmaması gerekiyor. Bunun yerine $_SESSION[$lastFloodTimeStr] değişkeninin değerine göre hesaplama yapılması gerekiyor. Bu nedenle $elapsed değişkeninin hesaplanması aşağıdaki gibi değiştirilmelidir:
$elapsed = (time() - $_SESSION[$lastFloodTimeStr]);
İlk kullanımda flood korumasının devre dışı kalması: İlk kullanımda $_SESSION[$lastFloodTimeStr] değişkeni henüz tanımlanmadığı için, $elapsed değişkeninin değeri negatif olacaktır. Bu durumda flood korumasının devre dışı kalması gerekiyor. Aşağıdaki değişikliklerle bu sağlanabilir:
if (!isset($_SESSION[$lastFloodTimeStr])) {
$_SESSION[$lastFloodCountStr] = 1;
$_SESSION[$lastFloodTimeStr] = time();
return true;
}
$elapsed = (time() - $_SESSION[$lastFloodTimeStr]);
if ($elapsed < $flood_time) {
...Yukarıdaki değişikliklerle birlikte kod aşağıdaki gibi olmalıdır: public function checkFlood($prefix)
{
$lastFloodTimeStr = "last_flood_time$prefix"; // $_SESSION içinde son flood zamanını tutan değişkenin adı
$lastFloodCountStr = "last_flood_count$prefix"; // $_SESSION içinde son flood sayısını tutan değişkenin adı
if (session_status() !== PHP_SESSION_ACTIVE) {
session_start(); // eğer session henüz başlatılmadıysa başlatır
}
$flood_limit = 1; // aynı işlemi bir saniye içinde kaç kez yapabileceğimizi belirten değişken
$flood_time = 1; // aynı işlemi tekrar yapabilmek için beklememiz gereken süre (saniye)
if (!isset($_SESSION[$lastFloodTimeStr])) {
$_SESSION[$lastFloodCountStr] = 1; // ilk kez işlem yapıldığında flood sayısı 1 olarak ayarlanır
$_SESSION[$lastFloodTimeStr] = time(); // ilk kez işlem yapıldığında son flood zamanı olarak mevcut zaman atanır
return true; // ilk işlem başarılı olacağı için true değeri döndürülür
}
$elapsed = (time() - $_SESSION[$lastFloodTimeStr]); // son işlemden geçen süre hesaplanır
if ($elapsed < $flood_time) { // eğer son işlemden geçen süre beklenen süreden küçükse
if (empty($_SESSION[$lastFloodCountStr])) {
$_SESSION[$lastFloodCountStr] = 1;
} elseif ($_SESSION[$lastFloodCountStr] < $flood_limit) {
$_SESSION[$lastFloodCountStr] = $_SESSION[$lastFloodCountStr] + 1;
} elseif ($_SESSION[$lastFloodCountStr] >= $flood_limit) { // flood limiti aşıldığında
$_SESSION[$lastFloodCountStr] = 0; // son flood sayısı sıfırlanır
$_SESSION[$lastFloodTimeStr] = time(); // yeni bir flood zamanı atanır
$message = "Flood has been blocked on this system!!!"; // mesaj değişkeni tanımlanır
$this->printMessage($message); // mesaj ekrana yazdırılır
die("<script>alert('$message')</script>"); // mesaj bir javascript alert kutusu olarak gösterilir ve işlem sonlandırılır
}
} else { // eğer son işlemden geçen süre beklenen süreden büyük veya eşitse
$_SESSION[$lastFloodCountStr] = 1; // son flood sayısı 1 olarak ayarlanır
}
$_SESSION[$lastFloodTimeStr] = time(); // yeni bir flood zamanı atanır
return true; // işlem başarılı olduğu için true değeri döndürülür
}
İşime yaradı çok teşekkür ederim. Çok sevindim