Anasayfa Projeler Yaklaşım Blog İletişim
Tüm yazılar

İletişim Formunu Spam'den Korumanın Katmanlı Yolu

CAPTCHA koymadan spam'in büyük kısmını nasıl kestiğimi anlatıyorum: honeypot, zaman eşiği, IP bazlı sınırlama ve sunucu tarafı doğrulama.

İletişim Formunu Spam'den Korumanın Katmanlı Yolu

Bir iletişim formu yayına aldıktan birkaç gün sonra bot trafiği başlar. İlk refleks CAPTCHA koymaktır ama CAPTCHA'nın bir bedeli var: gerçek müşterilerinizin bir kısmı o bulmacada vazgeçiyor. Formunuza gelen talep zaten azsa, spam'i engellerken müşteriyi de engellemiş olursunuz.

Aşağıdaki katmanlı yaklaşımla, kullanıcıya hiçbir ek yük bindirmeden spam'in büyük kısmını kesebilirsiniz. Bu sitenin iletişim formunda kullandığım yöntem de bu.

Katman 1 — Honeypot (bal küpü)

Basit ve şaşırtıcı derecede etkili. Forma, insanların göremeyeceği bir alan koyarsınız. Botların çoğu formu ayrıştırıp bütün alanları doldurur. Dolu gelen bu alan, gönderenin bot olduğunu söyler.

Kritik detay: Alanı type="hidden" ile gizlemeyin — botlar bunu tanır. CSS ile ekran dışına alın ve ekran okuyuculara da atlatın:

<div style="position:absolute; left:-9999px;" aria-hidden="true">
  <label>Web siteniz</label>
  <input type="text" name="website" tabindex="-1" autocomplete="off">
</div>

Sunucu tarafında tek satır kontrol:

if (!empty($_POST['website'])) {
    // Sessizce başarılı gibi davran — bota bilgi verme
    header("Location: /contact.php?status=success");
    exit;
}

Dikkat: bota "yakalandın" demeyin. Başarılı gibi davranırsanız spam yazılımı formu çalışır kabul edip stratejisini değiştirmez.

Katman 2 — Zaman eşiği

İnsan bir iletişim formunu 2 saniyede dolduramaz. Bot doldurur. Formun gösterildiği anın zaman damgasını gizli bir alanda taşıyın ve gönderimde farka bakın:

$elapsed = time() - (int)($_POST['form_ts'] ?? 0);
if ($elapsed < 3 || $elapsed > 3600) {
    // Çok hızlı: bot. Çok yavaş: bayat oturum.
    exit;
}

Zaman damgasını imzalayın (hash_hmac ile), aksi halde bot değeri kendisi üretir.

Katman 3 — IP bazlı hız sınırlama

Aynı IP'den saatte on kez form gönderilmesi normal bir davranış değildir. Her gönderimde IP'yi ve zamanı kaydedip, belirlediğiniz pencerede sınırı aşanı reddedin.

Küçük siteler için bir JSON dosyası yeterli; trafik arttığında veritabanına veya Redis'e taşıyın. İki uyarıya dikkat edin:

  • Eşzamanlı yazma: Dosyaya yazarken kilit kullanın (LOCK_EX), yoksa iki istek birbirinin kaydını ezer.
  • Paylaşılan IP: Aynı ofisten veya mobil operatörden gelen kullanıcılar aynı IP'yi paylaşabilir. Sınırı çok agresif tutmayın — saatte 3-5 gönderim makul bir başlangıç.
  • Log dosyası dışarı kapalı olsun. Kayıt dosyasını web kökünde tutuyorsanız .htaccess ile erişimi engelleyin; içinde ziyaretçi IP'leri var ve bu kişisel veridir.

Bu log dosyası zamanla büyür ve kimse ilgilenmezse sessizce şişer. Düzenli temizliğini bakım programınıza bir madde olarak ekleyin.

Katman 4 — Sunucu tarafı doğrulama

Tarayıcıdaki required ve type="email" nitelikleri kullanıcı deneyimi içindir, güvenlik değildir. Bot tarayıcı kullanmaz, doğrudan sunucuya istek atar. Her alanı sunucuda yeniden doğrulayın:

  • E-posta gerçekten geçerli formatta mı? (filter_var($mail, FILTER_VALIDATE_EMAIL))
  • Alanların uzunluk sınırı var mı? Bin karakterlik bir "isim" alanı şüphelidir.
  • Mesaj içinde bağlantı sayısı makul mü? Üç ve üzeri link, spam'in klasik imzasıdır.
  • Alanlarda satır sonu karakteri (\r\n) var mı? Bu, e-posta başlığı enjeksiyonu denemesidir — mutlaka temizleyin.

Doğrulama başarısız olduğunda kullanıcıya ne söylediğiniz de önemli. "Bir hata oluştu" demek yerine sorunu ve çözümü gösterin — bu prensibi yönetim paneli yazısında daha geniş ele aldım.

Katman 5 — Gerekirse CAPTCHA, ama görünmezi

Yukarıdaki dördü çoğu site için yeterli. Buna rağmen hedefli saldırı alıyorsanız CAPTCHA ekleyin — ama kullanıcıya bulmaca çözdüren klasik sürümü değil, arka planda çalışan görünmez sürümlerini tercih edin. Kullanıcı deneyimini bozmadan ek bir katman sağlar.

Sıralama önerisi

Hepsini birden kurmanıza gerek yok. Sırayla ekleyin ve her adımda gelen spam'i ölçün: honeypot tek başına genelde büyük bir düşüş sağlar, zaman eşiği kalanın çoğunu keser. Üçüncü katmana ihtiyacınız olmayabilir bile.

Ölçmeden katman eklemek, hem gereksiz karmaşıklık hem de gerçek müşteriyi engelleme riski demektir. Formunuzun asıl işi spam'i durdurmak değil — müşteriyi size ulaştırmak.

Diğer yazılar