Aşağıdaki küçük PHP örneğinde formda token üretiliyor gibi görünse de sunucu tarafında doğrulama yapılmıyor:
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = trim($_POST['email'] ?? '');
updateEmail($_SESSION['user_id'], $email);
}
$csrf = bin2hex(random_bytes(32));
$_SESSION['csrf'] = $csrf;
// HTML içinde:
echo '<input type="hidden" name="csrf" value="' . htmlspecialchars($csrf, ENT_QUOTES, 'UTF-8') . '">';Bir AI aracı bu kodu incelerken token üretimini ve HTML kaçışını görüp olumlu değerlendirebilir. Ancak kritik eksik, POST isteğinde gelen tokenın oturumdaki değerle karşılaştırılmamasıdır. Kötü niyetli bir site, kullanıcı tarayıcısını bu işlemi yapmaya yönlendirebilir.
Düzeltme ve inceleme istemi
İnceleme sırasında AI'dan yalnızca “güvenli mi?” diye cevap vermek yerine şu somut soruları yanıtlamasını isteyin: “Devlet değiştiren her POST isteği oturumdaki CSRF tokenını doğruluyor mu, karşılaştırma sabit zamanlı mı ve başarısız doğrulama işlemden önce duruyor mu?”
Asgari düzeltme şu yapıda olabilir:
session_start();
if (empty($_SESSION['csrf'])) {
$_SESSION['csrf'] = bin2hex(random_bytes(32));
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$provided = $_POST['csrf'] ?? '';
if (!is_string($provided) ||
!hash_equals($_SESSION['csrf'], $provided)) {
http_response_code(403);
exit('Geçersiz istek');
}
$email = trim($_POST['email'] ?? '');
updateEmail($_SESSION['user_id'], $email);
}Tokenın formda bulunması tek başına yeterli değildir. Doğrulama, e-posta güncelleme gibi yan etkili işlemden önce yapılmalıdır. Tokenı URL parametresinde taşımamak ve başarısız denemelerde işlemi sürdürmemek de önemlidir. Oturum açma, parola değişikliği veya silme gibi diğer durum değiştiren uç noktalar ayrıca incelenmelidir.
Doğrulama adımları
- Geçerli token ile gönderilen isteğin işlemi tamamladığını doğrulayın.
- Token alanını kaldırarak, rastgele bir değerle ve başka bir oturumdan alınmış tokenla test edin; her durumda 403 bekleyin.
- İsteği proxy veya test istemcisiyle token doğrulamasından önce iş mantığına ulaşmadığını gözlemleyin.
- GET isteğinin veri değiştirmediğini; değişiklik yapan uç noktaların CSRF kontrolüne sahip olduğunu kontrol edin.
- PHPUnit ile geçerli, eksik, yanlış türde ve yanlış token için ayrı sınır durumları yazın.
