Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi

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.

  1. Formun yalnızca GET ile değil, veri değiştiren bir POST action'ıyla işlendiğini belirleyin.
  2. Formun içine @Html.AntiForgeryToken() ekleyin.
  3. Formu işleyen POST action'ına [ValidateAntiForgeryToken] ekleyin.
  4. 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.
  5. 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.

DurumOlası nedenKontrol
Token alanı HTML'de yokYardı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 eksikTarayıcı çerezlerini ve POST gövdesini kontrol edin
Normal form çalışıyor, AJAX çalışmıyorAJAX isteği token alanını göndermiyorToken'ı form verisine veya framework'ün beklediği başlığa ekleyin
Token geçerli, işlem yine reddediliyorYetki veya iş kuralı kontrolü başarısızKullanı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.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic