PHP Rate Limiting ve HoneyPot Koruması


session_start();
$ip = $_SERVER['REMOTE_ADDR'];
$time = time();
$limit = 5; // 60 saniyede en fazla 5 kayıt denemesi
$blockTime = 900; // 15 dakika ban süresi

// Oturumda kayıtlı deneme sayısını kontrol et
if (!isset($_SESSION['register_attempts'])) {
    $_SESSION['register_attempts'] = [];
}

// Eski girişleri temizle
$_SESSION['register_attempts'] = array_filter($_SESSION['register_attempts'], function ($attempt) use ($time) {
    return $attempt > ($time - 60);
});

// Eğer limit aşılırsa IP'yi engelle
if (count($_SESSION['register_attempts']) >= $limit) {
    file_put_contents('blocked_ips.txt', "$ip|" . ($time + $blockTime) . "\n", FILE_APPEND);
    die("Çok fazla kayıt denemesi yapıldı. Lütfen daha sonra tekrar deneyin.");
}

// Engellenen IP'leri kontrol et
$blocked_ips = file('blocked_ips.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($blocked_ips as $blocked) {
    list($blocked_ip, $unblock_time) = explode('|', $blocked);
    if ($blocked_ip == $ip) {
        if ($time < $unblock_time) {
            die("Bu IP geçici olarak engellendi. Lütfen bekleyin.");
        }
    }
}

// HoneyPot (Gizli Tuzak Alanı) Kullanımı
if (!empty($_POST['honeypot'])) {
    die("Bot tespit edildi!");
}

// Yeni denemeyi kaydet
$_SESSION['register_attempts'][] = $time;

// Kullanıcının kayıt işlemi burada devam edebilir...
echo "Kayıt başarılı!";

Nasıl Çalışır?

  1. Rate Limiting (Hız Sınırlama):
    • 60 saniyede 5’ten fazla kayıt denemesi yapan IP'yi 15 dakika boyunca engeller.
    • Engellenen IP’leri blocked_ips.txt dosyasına yazar.
  2. HoneyPot (Bot Tuzak Alanı):
    • Formda görünmez bir alan (honeypot) eklenir. Eğer bir bot bu alanı doldurursa, otomatik olarak engellenir.
  3. HTML Formuna HoneyPot Alanı Ekleyin:
  4. <form action="register.php" method="post">    <input type="text" name="username" placeholder="Kullanıcı Adı" required>
        <input type="password" name="password" placeholder="Şifre" required>
        
        <!-- HoneyPot Alanı (CSS ile Gizlenir) -->
        <input type="text" name="honeypot" style="display:none;">
        
        <button type="submit">Kayıt Ol</button>
    </form>