CSRF (Cross-Site Request Forgery) token Türkçe açılımıyla “Siteler Arası İstek Sahteciliği”, PHP’te web uygulamalarında güvenlik amacıyla kullanılan bir mekanizmadır. CSRF saldırıları, yetkili bir kullanıcının bilgisi olmadan kötü niyetli bir saldırganın adına istekte bulunmasını içerir. Bu saldırılar, kullanıcının tarayıcısında oturum açıkken, saldırganın tarayıcıda oturum açmış gibi davranarak isteklerde bulunmasını amaçlar.
CSRF tokeni, web formu üzerinden gönderilen talepleri güvence altına almak için kullanılır. İşleyiş sırasıyla şu şekildedir:
- Sunucu, her oturum başına benzersiz bir CSRF token oluşturur ve bu tokeni kullanıcı oturumuna ilişkilendirir.
- Bu token, bir formun içine eklenir (genellikle bir gizli alan olarak).
- Kullanıcı formu doldurup gönderdiğinde, bu CSRF tokeni de sunucuya gönderilir.
- Sunucu, gelen CSRF tokeni ile kullanıcının oturumundaki tokeni karşılaştırır.
- Eğer tokenler uyuşuyorsa, istek işlenir; uyuşmuyorsa, istek reddedilir.
Bu mekanizma, saldırganın kullanıcının tarayıcısında oturum açıkken, form gönderme yeteneğine sahip olmasını zorlaştırır. Saldırganın doğru CSRF tokenini bilmesi gerektiği için saldırı riski azalır.
Özetle, kullanıcının oturum açtığı esnada bir csrf_token oluşturulur:
$token = uniqid(”, true);
Bu token, session value olarak tanımlanır:
($_SESSION[‘csrf_token’] = $token;)
ve yalnızca oturum açmış kullanıcının formlarına hidden olarak yerleştirilir. Bu yöntem sayesinde, kullanıcının oturumuna sızma girişimde başarılı olunsa bile benzersiz token değeri tahmin edilemez.
<?php // CSRF token oluşturma fonksiyonu function generate_csrf_token() { $token = uniqid('', true); // uniqid fonksiyonu kullanılarak benzersiz bir token oluşturuluyor $_SESSION['csrf_token'] = $token; // Oluşturulan token session'a kaydediliyor return $token; } // CSRF token kontrol fonksiyonu function validate_csrf_token($token) { return isset($_SESSION['csrf_token']) && $token === $_SESSION['csrf_token']; } // Form gönderildiğinde işlenecek kısım session_start(); // Session başlatılıyor if ($_SERVER['REQUEST_METHOD'] === 'POST') { // CSRF token kontrolü yapılıyor $submitted_token = $_POST['csrf_token'] ?? ''; if (validate_csrf_token($submitted_token)) { // CSRF token geçerli, işlemleri gerçekleştir // Örneğin, veritabanına veri ekleme veya başka bir işlem echo "CSRF token geçerli. İşlem gerçekleştirildi!"; } else { // CSRF token geçerli değil, işlem reddedildi echo "CSRF token geçersiz. İşlem reddedildi!"; } } // CSRF tokeni formda kullanmak için alınıyor $csrf_token = generate_csrf_token(); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CSRF Token Örneği</title> </head> <body> <h1>CSRF Token Örneği</h1> <!-- CSRF token form içinde bir gizli alan olarak ekleniyor --> <form method="post" action=""> <input type="hidden" name="csrf_token" value="<?php echo $csrf_token; ?>"> <!-- Diğer form elemanları buraya eklenebilir --> <button type="submit">Formu Gönder</button> </form> </body> </html>
Bu örnekte uniqid('', true)
fonksiyonu kullanılarak benzersiz bir token oluşturuluyor. Bu token daha sonra form içinde bir gizli alan olarak ekleniyor ve gönderildiğinde kontrol ediliyor.