Giriş: CSRF Token Hatası Nedir ve Neden Oluşur?
Bir gün ASP.NET Core projenizde bir hata ile karşılaştınız. Kullanıcı formunu göndermeye çalışırken, "CSRF Token Expired" hatasıyla karşılaştınız. Hemen kafanızda bir sürü soru işareti beliriyor, değil mi? “Bu token nedir, neden süresi dolmuş?” diye düşünüyorsunuz. Endişelenmeyin, yalnız değilsiniz. Bu yazıda, bu hatayı çözmenize yardımcı olacak adım adım bir rehber hazırladım.
CSRF (Cross-Site Request Forgery), web uygulamalarını hedef alan bir saldırı türüdür. Bu saldırının amacı, kullanıcının izni olmadan zararlı isteklerin gönderilmesidir. ASP.NET Core, bu tür saldırılara karşı korunmak için Token kullanır. Ancak, bazen bu token süresi dolduğunda "CSRF Token Expired" hatası alabilirsiniz.
CSRF Token Expired Hatasının Sebepleri
CSRF token’ları, her bir istek için benzersiz ve geçici bir anahtar görevi görür. Süresi dolan token’lar genellikle aşağıdaki nedenlerden ötürü oluşur:
1. Uzun Süreli Oturumlar: Kullanıcı çok uzun süre işlem yapmadığında, oturumun süresi dolar ve token geçersiz hale gelir.
2. Tarayıcı Çerezleri: Tarayıcıda çerezler silindiğinde veya çerezler tarayıcı tarafından engellendiğinde token kaybolur.
3. Yanlış Konfigürasyonlar: CSRF token’larının doğru şekilde yapılandırılmamış olması da bu hatayı tetikleyebilir.
Adım Adım Çözüm Yöntemleri
1. CSRF Token’ın Doğru Yapılandırıldığından Emin Olun
İlk olarak, CSRF korumasının doğru bir şekilde yapılandırıldığından emin olmanız gerekiyor. ASP.NET Core’da CSRF korumasını etkinleştirmek için `services.AddAntiforgery()` kullanılır.
Aşağıdaki gibi `Startup.cs` dosyanızda bu konfigürasyonu doğru şekilde yaptığınızdan emin olun:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddAntiforgery(options =>
{
options.HeaderName = "X-XSRF-TOKEN"; // CSRF token başlık adı
});
}
2. Formlarda CSRF Token'ını Dahil Edin
Formlarınızı gönderdiğinizde, CSRF token’ının doğru şekilde formun içine eklendiğinden emin olmalısınız. Bu token, her POST isteğiyle birlikte gönderilmelidir. Aşağıdaki gibi `@Html.AntiForgeryToken()` kullanarak formunuza token ekleyebilirsiniz:
Bu, her form gönderisi ile birlikte token’ın doğruluğunu kontrol etmenizi sağlar.
3. Token Süresi Ayarlarını Yapılandırın
Eğer kullanıcılarınızın uzun süre işlem yapmasını istiyorsanız, token sürelerini uzatmayı düşünebilirsiniz. Bu, token’ın süresinin dolmasını engelleyebilir. Token süresi, aşağıdaki gibi `options` parametreleriyle ayarlanabilir:
public void ConfigureServices(IServiceCollection services)
{
services.AddAntiforgery(options =>
{
options.Lifetime = TimeSpan.FromMinutes(60); // Token’ın geçerlilik süresi
});
}
Böylece, token’larınız belirlediğiniz süre kadar geçerli olacak.
4. Tarayıcı Çerezlerini Kontrol Edin
Bazı durumlarda, tarayıcı çerezleri token’ların doğru şekilde iletilmemesine neden olabilir. Eğer token çerezlerle gönderiliyorsa, çerezlerin doğru şekilde ayarlandığından emin olun. Çerezler, `SameSite` özelliği ile birlikte gönderilmelidir. Bu özellik, token’ların yalnızca doğru kaynağa (aynı siteye) gönderilmesini sağlar.
services.Configure(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.Strict;
});
5. CSRF Token’ın Kontrolünü Yapın
Son olarak, token’ın doğru bir şekilde doğrulandığını kontrol edin. ASP.NET Core’da, `[ValidateAntiForgeryToken]` özniteliği ile form gönderilerini doğrulayabilirsiniz. Bu, CSRF token’ının doğru olup olmadığını kontrol eder.
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult SubmitForm(MyModel model)
{
// Form işleme kodlarınız
return View();
}
Bu, token’ın süresinin dolup dolmadığını kontrol etmek için temel bir adımdır.
Sonuç
“CSRF Token Expired” hatası, genellikle güvenlik nedeniyle karşınıza çıkan bir engel gibi görünse de, doğru yapılandırma ile kolayca çözebilirsiniz. Token’larınızın geçerlilik süresini uzatarak, formlarınıza token ekleyerek ve doğru konfigürasyonu yaparak bu sorunu ortadan kaldırabilirsiniz.
Umarım bu rehber, karşılaştığınız hatayı çözmenize yardımcı olmuştur. Unutmayın, CSRF token’ları güvenliğinizi artırmak için kritik öneme sahiptir. Onlara dikkat ederek uygulamanızı güvenli tutabilirsiniz.