Cross-Site Request Forgery (CSRF), bir kullanıcının kimliğinin yetkili olduğu bir web uygulamasında, kullanıcının bilgisi dışında istenmeyen işlemler gerçekleştirmesini sağlayan bir saldırı türüdür. Saldırgan, kullanıcıyı (örneğin, bir bağlantıya tıklatarak veya zararlı bir web sayfasını ziyaret ettirerek) hedef uygulamaya oturum açmış haldeyken bir istek göndermeye zorlar. Tarayıcı, oturum çerezlerini otomatik olarak eklediği için sunucu bu isteği geçerli bir talep olarak kabul eder.
Teknik Terimler:
- Oturum Çerezi (Session Cookie): Kullanıcının kimliğini doğrulayan ve sunucu tarafından atanan bir tanımlayıcı.
- SameSite Çerezleri: Çerezlerin yalnızca aynı site bağlamında gönderilmesini sağlayan bir güvenlik özelliği.
- Referer Header: Bir isteğin hangi URL’den geldiğini gösteren HTTP başlığı.
- Kullanıcı Oturum Açar: Kullanıcı,
bank.com
gibi bir siteye giriş yapar ve oturum çerezi tarayıcıya kaydedilir. - Saldırganın Tuzağı: Kullanıcı, saldırganın kontrol ettiği bir sayfayı (
evil.com
) ziyaret eder veya zararlı bir bağlantıya tıklar. - Zararlı İstek Gönderilir: Bu sayfada,
bank.com/transfer?amount=1000&to=attacker
gibi bir isteği otomatik olarak tetikleyen bir form veya script bulunur.<form action="https://bank.com/transfer" method="POST"> <input type="hidden" name="amount" value="1000"> <input type="hidden" name="to" value="attacker"> </form> <script>document.forms[0].submit();</script>
- Tarayıcı Çerezi Ekler: Tarayıcı,
bank.com
için geçerli oturum çerezini isteğe ekler. - Sunucu İşlemi Onaylar: Sunucu, çerezi doğrular ve para transferini gerçekleştirir.
Zayıf bir uygulama, e-posta değişikliğini GET isteğiyle işliyorsa:
<img src="https://site.com/change-email?new_email=attacker@evil.com" width="0" height="0">
Kullanıcı bu görsele sahip bir sayfayı açtığında, tarayıcı otomatik olarak GET isteği gönderir.
Saldırgan, kullanıcıyı otomatik submit eden bir form içeren bir sayfaya yönlendirir:
<body onload="document.forms[0].submit()">
<form action="https://bank.com/transfer" method="POST">
<!-- Gizli input'lar -->
</form>
</body>
- Nasıl Çalışır? Sunucu, her kullanıcı oturumu için benzersiz bir token oluşturur ve bunu formlara ekler. İstek geldiğinde token doğrulanır.
- Uygulama Örneği (PHP):
// Token oluşturma ve session'a kaydetme $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // Formda gösterim <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>"> // Doğrulama if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die("Geçersiz token!"); }
- Nasıl Çalışır? Çerezlerin
SameSite=Lax
veyaStrict
olarak ayarlanması, başka sitelerden gelen isteklerde çerezlerin gönderilmesini engeller. - Örnek Cookie Ayarları:
Set-Cookie: session_id=123; SameSite=Lax; Secure
- Sunucu, gelen isteğin
Referer
başlığını kontrol ederek isteğin geçerli bir kaynaktan gelip gelmediğini doğrular. Ancak bazı tarayıcılar veya gizlilik eklentileri bu başlığı kaldırabilir.
-
Zorluk: Token’ların XSS ile çalınması.
- Çözüm: XSS açıklarını kapatmak için çıktıları temizleme (HTML escape) ve
HttpOnly
çerezler kullanma.
- Çözüm: XSS açıklarını kapatmak için çıktıları temizleme (HTML escape) ve
-
Zorluk: Legacy sistemlerde SameSite desteğinin olmaması.
- Çözüm: CSRF tokenları ile birlikte
Referer
kontrolü uygulama.
- Çözüm: CSRF tokenları ile birlikte
-
Zorluk: API’larda CSRF koruması.
- Çözüm: Bearer token (JWT) kullanımı ve token’ların
Authorization
header’ı ile gönderilmesi.
- Çözüm: Bearer token (JWT) kullanımı ve token’ların
- Framework Kullanımı: Django, Rails, Spring Security gibi framework’ler yerleşik CSRF koruması sağlar.
- Çok Katmanlı Savunma: Token + SameSite + Referer kontrolü kombinasyonu.
- Eğitim: Geliştiricilere güvenli kodlama eğitimi verilmesi.
CSRF, oturum çerezlerinin kötüye kullanılmasına dayanan kritik bir güvenlik açığıdır. Token tabanlı koruma ve modern çerez politikalarıyla etkili şekilde önlenebilir. Savunmaların proaktif olarak uygulanması ve düzenli güvenlik testleri, riski en aza indirir.