• 04-03-2023, 11:42:54
    #1
    Merhaba, aşağıdaki php kodunu bazı yerlerde flood koruması yapmak için kullanıyorum ancak şöyle bir sorun var;
    İlk işlemden sonra flood koruması devreye girmesi gerekirken, ilk işlemi gerçekleştirdiğimde flood uyarısı veriyor, daha sonra sağlıklı çalışmaya başlıyor.
    Benim istediğim ise, ilk kullanımda engele takılmadan ilk kullanımdan sonraki kullanımlarda kodun çalışmasıdır.
    Teşekkürler.

    public function checkFlood($prefix)
        {
            $lastFloodTimeStr = "last_flood_time$prefix";
            $lastFloodCountStr = "last_flood_count$prefix";
            if (session_status() !== PHP_SESSION_ACTIVE)
                session_start();
            # burasi flood limiti 2 yaparsaniz 2 kere islem yapar 
            $flood_limit = 1;
            # flood zamani / sn
            $flood_time = 1;
            if(!isset($_SESSION[$lastFloodTimeStr]))
            {
                $_SESSION[$lastFloodCountStr] = 1;
                $_SESSION[$lastFloodTimeStr] = time();
            }
            $elapsed = (time() - $flood_time);
            if ($_SESSION[$lastFloodTimeStr] > $elapsed) {
                if (empty($_SESSION[$lastFloodCountStr])) {
                    $_SESSION[$lastFloodCountStr] = 1;
                } elseif ($_SESSION[$lastFloodCountStr] < $flood_limit) {
                    $_SESSION[$lastFloodCountStr] = $_SESSION[$lastFloodCountStr] + 1;
                } elseif ($_SESSION[$lastFloodCountStr] >= $flood_limit) {
                    $_SESSION[$lastFloodCountStr] = 0;
                    $_SESSION[$lastFloodTimeStr] = time();
                    
                    $message = "Flood has been blocked on this system!!!";
                    $this->printMessage($message); // belki de sistem çalışıyor bu işi bozuyor bakalım şimdi
                    die("<script>alert('$message')</script>");
                }
            } else {
                $_SESSION[$lastFloodCountStr] = 1;
            }
            $_SESSION[$lastFloodTimeStr] = time();
            return true;
        }
    }
  • 04-03-2023, 12:07:03
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    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
    }
  • 04-03-2023, 12:16:05
    #3
    mraliaras adlı üyeden alıntı: mesajı görüntüle
    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