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.
- Sayfanız ilk yüklenme esnasında sunucudan bir uniqe (benzersiz) anahtar talep ediyor ve alıyor.
(Örnek: cbUXFsuIuTkcOOFDR-LGvdO7S3ElbL_u7h371HHD0pCcfFeSccOn5akIZttHtzBqsu4Th49VvD0Vn0CjMQoGgbcGZ1378UsA154AeY9oZ7k1) - Bu bilgi <form> tag’inin içerisinde olduğu için otomatik olarak __RequestVerificationToken adında bir hidden nesnesinde tutuluyor.
- Daha sonra kullanıcı formu oldurup butona tıkladığında post işleminde bu değer de sunucu tarafında post ediliyor.
- 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… 🙂
Bir konu ne kadar yüzeysel anlatılabilir ise o kadar anlatmışsın.CSRF nedir ne değildir az detay verseydin.
Anlatırız elbette. Eğer talep var ise neden olmasın?
Kenara not ediyorum. En kısa zamanda güncellerim o vakit. 🙂
Geri bildirim için teşekkürler 👍
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?
Kod tarafında metoda [ValidateAntiForgeryToken] attribute’ünü eklediniz değil mi?
Gönderirken de post ettiğiniz formun içerisinde nesne olarak veya jquery ajax kullanıyorsanız DATA’nın içerisinde mutlaka @Html.AntiForgeryToken() ile gelen değeri de sunucuya göndermelisiniz.
Eğer bunlar tamam ise sadece formun @Html.AntiForgeryToken() olan kısmını ve kod tarafındaki methodun (tabii ki özel alanları gizleyerek) paylaşabilir misiniz bir bakalım.