- Konu sahibi
- #1
Html.AntiForgeryToken nedir?
Html.AntiForgeryToken(), ASP.NET MVC veya Razor tabanlı uygulamalarda çerez tabanlı oturumlarda sahte çapraz site isteklerini önlemeye yardımcı olan anti-CSRF aracıdır. Form içine gizli bir token alanı ekler; sunucu tarafında [ValidateAntiForgeryToken] ile birlikte kullanıldığında, başka bir sitenin kullanıcının tarayıcısı üzerinden yetkisiz POST isteği göndermesini engellemeye yardımcı olur. Bu, HTML standardına ait bir etiket değil, ASP.NET HTML yardımcısıdır.Nasıl çalışır?
Yardımcı form içinde görünmeyen bir alan üretir. ASP.NET ayrıca tarayıcıda doğrulama amacıyla kullanılan bir çerez oluşturur. Form gönderildiğinde sunucu, istek token’ı ile anti-forgery çerezinin geçerli ilişkisini ve uygun kullanıcı bağlamını doğrular. Bu iki değerin düz metin olarak aynı olması beklenmez. Değerlerden biri eksik veya geçersizse istek doğrulanmaz.
Token üretmek tek başına doğrulama yapmaz. Aşağıdaki örnek ASP.NET MVC 5 ve Razor görünümü içindir; AccountController içindeki
Delete action’ına değil, veri değiştirmeyen bir doğrulama denemesine gider:
Kod:
@using (Html.BeginForm("CheckToken", "Account", FormMethod.Post))
{
@Html.AntiForgeryToken()
<button type="submit">Token kontrolünü dene</button>
}
Kod:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CheckToken()
{
return Content("Token doğrulandı.");
}
ASP.NET Core MVC’de Form Tag Helper uygun POST formlarında, BeginForm ise GET dışı formlarda varsayılan olarak token üretebilir. Üretilen HTML’yi görmeden aynı forma tekrar elle token eklemeyin. MVC’de doğrulama filtresi yine yapılandırılmalıdır; Razor Pages ise varsayılan olarak CSRF korumasına sahiptir. Yukarıdaki MVC 5 kodunu Core’a taşırken ActionResult ve filtrelerin doğru framework ad alanlarını kullanın. Uygulamanızın framework sürümüne göre isim ve varsayılan davranışlar değişebileceğinden, MVC 5 ile ASP.NET Core kodunu aynı projede karıştırmayın.
Uygulanabilir kullanım kararı
Bir form sunucu tarafında oturum açmış kullanıcı adına veri değiştiriyorsa token ekleyin ve isteği işleyen POST action'ında doğrulayın. Yalnızca herkese açık, veri değiştirmeyen bir GET bağlantısı için bu yardımcıyı eklemek genellikle gerekli değildir. Silme, güncelleme, ödeme başlatma, parola değiştirme ve yönetim işlemleri gibi isteklerde özellikle önemlidir.
- Formun yalnızca GET ile değil, veri değiştiren bir POST action'ıyla işlendiğini belirleyin.
- Formun içine
@Html.AntiForgeryToken()ekleyin. - Formu işleyen POST action'ına
[ValidateAntiForgeryToken]ekleyin. - Test ortamında normal formun doğrulamadan geçtiğini kontrol edin. Sonra yalnız gizli istek token’ını çıkardığınız aynı isteğin reddedildiğini doğrulayın; başarısızlık kodunu framework’ün davranışına göre yorumlayın.
- Doğrulama hatası alırsanız form alanının gerçekten oluşturulup oluşturulmadığını, isteğin POST olup olmadığını ve çerezlerin tarayıcı tarafından engellenmediğini inceleyin.
Bu örnekte başarı yanıtı token doğrulamasının geçtiğini gösterir; kullanıcının bu işlemi yapmaya yetkili olduğunu göstermez. Bu nedenle token kontrolünün yanında kimlik doğrulama ve yetkilendirme kontrolleri de yapılmalıdır.
Sık karşılaşılan durumlar
Aşağıdaki ayrım, sorunun token üretiminden mi yoksa isteğin gönderilme biçiminden mi kaynaklandığını anlamayı kolaylaştırır.
| Durum | Olası neden | Kontrol |
|---|---|---|
| Token alanı HTML'de yok | Yardımcı formun içine eklenmemiş veya Razor kodu çalışmıyor | Üretilen HTML içinde gizli anti-forgery alanını arayın |
| Doğrulama hatası | Alan, çerez veya beklenen istek biçimi eksik | Tarayıcı çerezlerini ve POST gövdesini kontrol edin |
| Normal form çalışıyor, AJAX çalışmıyor | AJAX isteği token alanını göndermiyor | Token'ı form verisine veya framework'ün beklediği başlığa ekleyin |
| Token geçerli, işlem yine reddediliyor | Yetki veya iş kuralı kontrolü başarısız | Kullanıcının kimliğini ve ilgili kaynağa erişimini denetleyin |
AJAX ile gönderilen isteklerde yalnızca sayfada token bulunması yeterli olmayabilir; istemci kodu bu değeri isteğe taşımalıdır. Form verisini
FormData ile gönderiyorsanız gizli alanın dahil edildiğini kontrol edin. Sunucu belirli bir HTTP başlığı bekliyorsa, token değerini o başlığa taşıma biçimi kullanılan ASP.NET sürümünün kuralına uygun olmalıdır.Sık sorulan sorular
Anti-forgery token parola veya yetki kontrolü müdür?
Hayır. Token, isteğin beklenen uygulama akışından gelip gelmediğini doğrulamaya yardımcı olur. Kullanıcının hangi işlemi yapabileceği ayrıca kimlik doğrulama ve yetkilendirme ile denetlenir.
Token, XSS açığına karşı da korur mu?
Hayır. Aynı sitede çalışan zararlı JavaScript token’a veya yetkili işlemlere erişebilir. Çıktı kodlama ve XSS önlemleri ayrı gereklidir; anti-forgery doğrulaması bunların yerine geçmez.