İçeriğe geç

AntiForgeryToken ve MVC

Merhaba Arkadaşlar,

Bugün sizlere antiforgerytoken ile sitelere yapılan atakların bir kısmını çözümlemekten bahsetmek istiyorum. Aslında çoğumuzca aşina olunan bir konu. Zira .net bu konuda antiforgerytoken implamantasyonunu yapar iken oldukça basit kullanımı olacak şekilde sunmaya özen göstermiş durumda. Sadece bir attribute ekleyerek bu özelliği ilgili metodumuzda aktif edebiliyoruz.

Peki Nedir bu antiforgerytoken?

Özellikle MVC’den önceki teknolojilerin herhangi biri ile yazılım geliştirmiş iseniz bu konuyu daha net kavrayabilirsiniz. Diyelim ki bir formunuz var. (Üyelik, Giriş, Bilgi, İletişim, vb…) Ve bu formda haliyle inputlar vasıtası ile bir takım bilgiler talep ediyorsunuz. (Kullanıcı adı, şifre, vb…) İşte burada eğer unique olan bir kimliğe sahip değil iseniz dışarıdan ilgili URL’e gelecek ve ilgili inputları içeren tüm isteklere maruz kalırsınız.

Yani diyelim ki “http://siteadresiniz.com/login” gibi bir URL’iniz olsun ve bu sayfada kullanıcıdan “Username, Password” isimli iki input’u doldurmasını ve yine “http://siteadresiniz.com/login” adresine post etmesini istiyor olun. İşte tam da burada bir hata yapıyor ve anonim ataklara karşı açık hale geliyorsunuz.

Kötü niyetli kişinin bir bot yazarak veya basit bir JS ile bile bu sayfaya farklı denemeler yaparak login olmasını denemesini sağlayabiliyorsunuz.

Kişi; Username ve Password adında iki alanı sanki input imiş gibi sizin ilgili adresinize durmadan dışarıdan post edip giriş yapmayı deneyebiliyor.

Burada denemelerin sonrasında alabileceğiniz bir sürü engel var elbette. Ama işte antiforgerytoken tam da bu gibi bir konunun hiç yaşanmaması adına devreye giriyor.

Peki AntiForgeryToken Nasıl Çalışıyor?

Sunucu (server) tarafında yalnızca o istek için oluşturulan bir uniqe (tekil/benzersiz) anahtar yer alıyor ve bu anahtarı sayfanıza çağırıyorsunuz;

@Html.AntiForgeryToken()

İşte bu noktada ilgili inputlar post edilir iken metodunuza aşağıdaki attribute’ü eklemiş olmanız gerekiyor.

[ValidateHttpAntiForgeryToken]

İşlem bu sıra ile yapılmış ise o zaman süreç şöyle işleyecektir.

  1. Sayfanız ilk yüklenme esnasında sunucudan bir uniqe (benzersiz) anahtar talep ediyor ve alıyor.
    (Örnek: cbUXFsuIuTkcOOFDR-LGvdO7S3ElbL_u7h371HHD0pCcfFeSccOn5akIZttHtzBqsu4Th49VvD0Vn0CjMQoGgbcGZ1378UsA154AeY9oZ7k1)
  2. Bu bilgi <form> tag’inin içerisinde olduğu için otomatik olarak __RequestVerificationToken adında bir hidden nesnesinde tutuluyor.
  3. Daha sonra kullanıcı formu oldurup butona tıkladığında post işleminde bu değer de sunucu tarafında post ediliyor.
  4. Sunucu, bu değerin kendisinin ürettiği bir anahtar olup olmadığını anladığı ve izin verdiği taktirde method kullanılabilir oluyor ve kodlarını çalışmaya başlıyor.

Aksi taktirde, yani bu değer sunucu tarafından üretilmemiş ise o zaman kullanıcı hata sayfasıyla karşılaşıyor ve haliyle siz ne kadar kod yazarsanız yazın, hiç biri çalışmaya başlamıyor. Haliyle sunucunuz yorulmuyor ve boşu boşuna işlem yapmak zorunda kalmıyorsunuz.

Kıssadan hisse; İstemciden (ön yüzden) gelecek olan talebin, gerçekten sitenin ön yüzünden geldiğini anlamak için MVC’nin bize sunmuş olduğu oldukça güzel bir özelliktir AntiForgeryToken.

Sorularınız olur ise aşağıdaki YORUM kısmına yazmayı lütfen ihmal etmeyin.

İyi çalışmalar… 🙂

4.5 6 votes
Article Rating
Tarih:Asp.Net - MVC
Subscribe
Bildir
guest
6 Yorum
Eskiler
En Yeniler Beğenilenler
Inline Feedbacks
View all comments
Net Coder
Net Coder
3 yıl önce

Bir konu ne kadar yüzeysel anlatılabilir ise o kadar anlatmışsın.CSRF nedir ne değildir az detay verseydin.

Volkan
Volkan
3 yıl önce

Merhaba,VisualStudio 2017 kullaniyorum. MVC ASP.Net ile site yaptim. Form uzerinden istek gonderdigimde projeyi publish etmeden studio da calistirinca Token request ediliyor, ama internette hostinge yukleyince __REQUESTVERIFICATIONTOKEN is not present hatasi veriyor. Nedeni nedir, yada duzeltilebilir mi?

Tatech
Tatech
8 ay önce

Şunu tam anlamadım, sayfa açılırken bir token üretiliyor. Daha sonra form submit olduğunda nerde diğer token üretilip karşılaştırılma yapılıyor? Teşekkürler

6
0
Would love your thoughts, please comment.x