XOOPS Üye Kayıt Formuna Katmanlı Bot Koruması ve Yapboz Captcha Entegrasyonu
XOOPS'un profile modülünün kayıt formu, varsayılan haliyle yalnızca basit bir matematik sorusu içeriyor. Bu, modern botların birkaç saniyede çözebildiği bir engel. Bu yazıda söz konusu zafiyetin nasıl fark edildiğini ve sekiz katmanlı bir güvenlik mimarisine nasıl dönüştürüldüğünü anlatıyorum.
Sorunun anatomisi
Varsayılan kayıt formunda kullanıcıdan istenen tek bariyer 7 − 0 = ? gibi bir ifadenin sonucunu girmek. Botlar bu tür testleri OCR veya düz metin ayrıştırmayla saniyeler içinde geçebilir. Captcha, gerçek bir engel olmaktan çıkmış; yalnızca bir görüntü unsuru haline gelmiş.
Önceki durum
Sadece matematik sorusu captcha
Bot tarafından otomatik çözülebilir
Rate limiting yok
Session token doğrulaması yok
Her IP sınırsız deneme yapabiliyor
Headless browser ile kolayca geçiliyor
Sonraki durum
8 katmanlı güvenlik mimarisi
Görsel yapboz — sürükleme analizi
IP başına saatlik 5 deneme limiti
HMAC imzalı session token
Honeypot alanlarıyla tuzak
JS davranış skoru analizi
Güvenlik katmanları
Tek bir güvenlik önlemi asla yeterli değildir. Gerçek dayanıklılık, birbirini destekleyen ve birbirinin zayıflığını kapatan katmanlardan gelir.
1.Honeypot alanları sunucu
Forma CSS ile gizlenmiş website, url_input, phone_alt adlı üç alan eklendi. Gerçek kullanıcılar bu alanları görmez ve doldurmaz. Botlar form alanlarını tarayarak otomatik doldurduğundan bu alanlarda herhangi bir değer gelmesi anında red sinyali üretir.
2.Session token (CSRF koruması) her iki taraf
Form her yüklendiğinde PHP'de 48 karakterlik rastgele bir token üretilir ve session'a yazılır. POST geldiğinde gönderilen token ile session'daki token hash_equals() ile zamanlama saldırısına karşı güvenli biçimde karşılaştırılır. Dışarıdan form gönderilmesi bu sayede engellenir.
3.Zaman analizi sunucu
Sayfa yüklenme zamanı session'a kaydedilir. 4 saniyeden kısa sürede gönderilen formlar reddedilir. İnsan bir formu doldurmak için en az birkaç saniyeye ihtiyaç duyar; otomasyon araçları ise milisaniyeler içinde gönderim yapar.
4.JS davranış skoru istemci
JavaScript, sayfada gerçekleşen fare hareketlerini, klavye vuruşlarını, odak değişikliklerini ve yapıştırma sayısını izler. Bu etkileşimlere göre 0-100 arasında bir bot skoru hesaplanır ve gizli bir input'a yazılır. İnsan davranışı skoru düşürürken bot davranışı yükseltir. Form submit anında skor 40'ın üzerindeyse red.
5.User-Agent filtresi sunucu
curl, wget, python-requests, scrapy, sqlmap, nikto ve 25'ten fazla bilinen otomasyon aracının imzası kontrol edilir. Boş User-Agent da reddedilir; gerçek tarayıcılar bu başlığı her zaman gönderir.
6.IP başına rate limiting sunucu
Her IP adresinin saatlik denemesi XOOPS_VAR_PATH/caches/botprotect/ dizinindeki JSON dosyalarıyla izlenir. Bir saat içinde 5 başarısız denemede o IP 60 dakika engellenir. Veritabanı gerektirmez; dosya tabanlı çalışır.
7.Referer ve Accept-Language kontrolü sunucu
Referer başlığı sitenin dışından geliyorsa istek reddedilir. Accept-Language başlığının yokluğu da bot sinyali olarak işlenir; gerçek tarayıcılar bu başlığı her zaman gönderir.
8.Yapboz (slider puzzle) captcha her iki taraf
Matematik sorusunun yerini bir görsel yapboz aldı. Kullanıcı slider'ı sürükleyerek parçayı doğru konuma getirir. Doğrulama sunucu tarafında parçanın X koordinatı ile session'daki hedef koordinat karşılaştırılarak yapılır.
Matematik sorusunu aşabilen bir bot, artık önce honeypot tuzağını, ardından imzalı session token'ı, zaman testini, JS davranış analizini, UA filtresini, rate limiting'i ve son olarak görsel yapboz koordinat doğrulamasını geçmek zorunda. Bu katmanların tamamını atlatmak için artık gerçek bir tarayıcı davranışını simüle eden, XOOPS session mekanizmasını anlayan, HMAC hesabı yapabilen ve insan gibi davranan bir araç gerekiyor.
Bu gerekliliklerin birleşimi, pratik bot saldırılarının ezici çoğunluğunu ekonomik açıdan caydırıcı kılmaktadır.