Furkan KapukayaYazılım geliştirme
Güvenlik ve KVKK3 dk okuma

CSRF Nedir? Siteler Arası İstek Sahteciliğine Karşı Korunma

Cross-Site Request Forgery (CSRF) saldırısının çalışma mantığı, örnek senaryo, anti-forgery token, SameSite çerezler, ASP.NET Core koruması, API'lerde durum ve sık yapılan hatalar.

CSRF (Cross-Site Request Forgery), kullanıcının oturum açık olduğu bir sitede, haberi olmadan istek yaptırılmasıdır. Saldırgan kullanıcının parolasını bilmez; tarayıcının çerezleri otomatik göndermesinden yararlanır. Kullanıcı başka bir sayfayı gezerken, arka planda bankasına veya yönetim paneline istek gönderilmiş olabilir.

Nasıl çalışır?

  1. Kullanıcı panel.ornek.com'a giriş yapmıştır; oturum çerezi tarayıcıdadır.
  2. Başka bir sekmede saldırganın hazırladığı sayfayı açar.
  3. Bu sayfa görünmez bir form ile panel.ornek.com/kullanici/eposta-degistir adresine istek gönderir.
  4. Tarayıcı çerezi otomatik ekler; panel isteği meşru kullanıcıdan gelmiş gibi işler.
<form action="https://panel.ornek.com/eposta-degistir" method="post">
  <input type="hidden" name="eposta" value="saldirgan@example.com">
</form>
<script>document.forms[0].submit()</script>

E-posta değiştikten sonra saldırgan "parolamı unuttum" ile hesabı ele geçirebilir.

Savunmalar

1. Anti-forgery token

Sunucu, her formda tahmin edilemez bir token gönderir ve istekte bu token'ı doğrular. Saldırganın sayfası bu token'ı okuyamadığı için sahte istek reddedilir.

ASP.NET Core MVC ve Razor Pages'te form etiket yardımcıları token'ı otomatik ekler ve doğrulama varsayılan olarak etkindir. Minimal API'lerde form tabanlı uç noktalar için antiforgery ara katmanı etkinleştirilmelidir.

2. SameSite çerezler

Çerezlerin SameSite özniteliği, başka sitelerden gelen isteklerde gönderilip gönderilmeyeceğini belirler:

DeğerDavranış
StrictBaşka siteden gelen hiçbir istekte gönderilmez
LaxÜst düzey gezinmelerde (bağlantıya tıklama) gönderilir, arka plan POST isteklerinde gönderilmez
NoneHer durumda gönderilir (Secure zorunlu)

Modern tarayıcılar özniteliği belirtilmeyen çerezlere çoğunlukla Lax davranışı uygular; bu, CSRF riskini önemli ölçüde azaltmıştır. Yine de tarayıcı farklılıkları ve alt alan adı senaryoları nedeniyle tek başına güvenilmemeli, token ile birlikte kullanılmalıdır.

3. GET istekleri durum değiştirmemeli

Silme, güncelleme ve ödeme gibi işlemler asla GET ile yapılmamalıdır. Bir görsel etiketi bile GET isteği tetikleyebilir. Bkz. REST API.

4. Kritik işlemlerde yeniden doğrulama

E-posta, parola veya ödeme bilgisi değişikliklerinde mevcut parolanın veya ikinci faktörün istenmesi ek bir kalkan oluşturur.

API'lerde durum

Kimlik bilgisini çerez yerine Authorization başlığında taşıyan API'ler (örneğin JWT ile) klasik CSRF'e karşı doğal olarak korunur; çünkü tarayıcı bu başlığı otomatik eklemez. Ancak API çerez tabanlı kimlik doğrulama kullanıyorsa aynı korumalar gerekir. CORS ayarlarının gevşek tutulması (her kaynağa kimlik bilgisiyle izin vermek) bu korumayı da zayıflatır.

Sık yapılan hatalar

  • Token doğrulamasını "hata veriyor" diye kapatmak
  • Durum değiştiren işlemleri GET ile yapmak
  • SameSite=None çerezleri gereksiz yere kullanmak
  • XSS açığı bulunan sitede CSRF korumasının anlamsızlaşacağını unutmak; XSS ile token da okunabilir. Bkz. XSS

Sık sorulan sorular

CSRF hâlâ güncel bir tehdit mi?

SameSite varsayılanları riski azaltmış olsa da yanlış yapılandırmalar, eski tarayıcılar ve özel senaryolar nedeniyle güncelliğini korur.

Tek sayfalık uygulamalarda CSRF olur mu?

Kimlik doğrulama çerezle yapılıyorsa evet. Çerez tabanlı SPA'larda token veya özel başlık kontrolü uygulanmalıdır.

Sonuç

CSRF, tarayıcının iyi niyetli davranışını istismar eder. Anti-forgery token, doğru SameSite ayarları ve durum değiştirmeyen GET istekleri; bu saldırıya karşı basit ama etkili bir savunma oluşturur. Diğer riskler için bkz. OWASP Top 10.