ValidateAntiForgeryTokun amaç, açıklama ve örnek


310

MVC 4'te ValidateAntiForgeryToken amacını açıklayabilir ve bana örnek gösterebilir misiniz ValidateAntiForgeryToken?

Bu özelliği açıklayan herhangi bir örnek bulamadım?


8
VJAI

1
Bu arada, MS'in neden bunu .BeginFormyardımcıya koymayı mümkün kılmadığını gerçekten anlamıyorum . Bu şey otomatik olarak orada, Rails gibi
jazzcat

Yanıtlar:


350

MVC'nin sahtecilikle mücadele desteği, yalnızca HTTP çerezine benzersiz bir değer yazar ve aynı değer forma yazılır. Sayfa gönderildiğinde, çerez değeri form değeriyle eşleşmezse bir hata oluşur.

Özelliğin siteler arası istek sahtekarlıklarını önlediğini belirtmek önemlidir . Yani, kimliği doğrulanmış bir kullanıcının kimlik bilgilerini kullanarak gizli içerik gönderme girişiminde bulunmak üzere başka bir siteden sitenize gönderilen bir formdur. Saldırı, oturum açmış kullanıcının bir form göndermesi için kandırılmasını veya sayfa yüklendiğinde bir formu programlı olarak tetiklemesini içerir.

Bu özellik, başka türlü veri sahteciliği veya kurcalamaya dayalı saldırıları engellemez.

Bunu kullanmak için, eylem yöntemini veya denetleyiciyi ValidateAntiForgeryTokenöznitelikle süsleyin ve yönteme gönderilen @Html.AntiForgeryToken()formlara bir çağrı yapın .


5
@Chris İkisi de. Cevabım gereği: "yalnızca HTTP çerezine benzersiz bir değer yazar ve sonra aynı değer forma yazılır "
Richard Szalay

21
Bu neden varsayılan olarak ayarlanmadı?
Christian Hagelid

12
@Christian çünkü Ruby on Rails değil. ;-)
Martin Capodici

6
Öyle görünüyor ki __RequestVerificationToken ve __RequestVerificationToken çerezi aynı değil, bir çift olarak çalışıyorlar.
WaiKit Kung

5
@rdans CORS ve CSRF hiç de farklı değil. CORS, diğer alan adlarının sunucunuzdaki API'lara erişmesine izin vermek içindir, CSRF, form formunun beklediğiniz sayfadan geldiğinden emin olmakla ilgilidir.
Richard Szalay

52

ValidateAntiForgeryToken özniteliğinin temel amacı siteler arası istek sahteciliği saldırılarını önlemektir.

Siteler arası istek sahteciliği, güvenilir bir kullanıcının tarayıcısından zararlı bir komut dosyası öğesinin, kötü amaçlı komutun veya kodun gönderildiği bir saldırıdır. Bununla ilgili daha fazla bilgi için lütfen http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages adresini ziyaret edin .

Kullanımı basit, yöntemi ValidateAntiForgeryToken özniteliğiyle aşağıdaki gibi dekore etmeniz gerekir:

[HttpPost]  
[ValidateAntiForgeryToken]  
public ActionResult CreateProduct(Product product)  
{
  if (ModelState.IsValid)  
  {
    //your logic 
  }
  return View(ModelName);
}

System.Web.Mvc ad alanından türetilmiştir.

Ve sizin görünümünüzde, jeton eklemek için bu kodu ekleyin, böylece formu gönderildikten sonra formu doğrulamak için kullanılır.

@Html.AntiForgeryToken()

Evet haklısınız, formunuzdan @ Html.AntiForgeryToken () öğesini çağırmanız ve ValidateAntiForgeryTokenAttribute öğesini korumak istediğiniz eylem yöntemine eklemeniz gerekir.
Chandra Malla

Anlamak için bu basit cevap için teşekkürler :)
noobprogrammer

4

ASP.Net Core'da anti sahtecilik belirteci formlara otomatik olarak eklenir, bu nedenle @Html.AntiForgeryToken()ustura form öğesi kullanıyorsanız veya IHtmlHelper.BeginForm kullanıyorsanız ve formun yöntemi GET değilse eklemeniz gerekmez.

Formunuz için aşağıdakine benzer bir girdi öğesi oluşturur: <input name="__RequestVerificationToken" type="hidden" value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">

Ve kullanıcı form gönderdiğinde, doğrulama etkinleştirilirse bu simge sunucu tarafında doğrulanır.

[ValidateAntiForgeryToken]nitelik eylemlere karşı kullanılabilir. Bu filtre uygulanmış eylemlere yapılan istekler, istek geçerli bir antiforgery belirteci içermediği sürece engellenir.

[AutoValidateAntiforgeryToken]öznitelik denetleyicilere karşı kullanılabilir. Bu öznitelik, ValidateAntiForgeryToken özniteliğiyle aynı şekilde çalışır, ancak aşağıdaki HTTP yöntemleri kullanılarak yapılan istekler için belirteç gerektirmez: GET HEAD OPTIONS TRACE

Ek bilgiler: https://docs.microsoft.com/pl-pl/aspnet/core/security/anti-request-forgery


2

Microsoft, uygulamamızda güvenlik amaçları için kullandığımız yerleşik işlevselliği sağlar, böylece kimse sitemizi hackleyemez veya bazı kritik bilgileri istila edemez.

Gönderen ValidateAntiForgeryToken yılında MVC uygulamanın amacı Harpreet Singh:

ValidateAntiForgeryToken Kullanımı

Bu kavramı anlamak için basit bir örnekle deneyelim. Çok karmaşık hale getirmek istemiyorum, bu yüzden zaten Visual Studio'da bulunan bir MVC uygulaması şablonu kullanacağım. Bunu adım adım yapacağız. Hadi başlayalım.

  1. Adım 1 - Varsayılan internet şablonuyla iki MVC uygulaması oluşturun ve bu adları sırasıyla CrossSite_RequestForgery ve Attack_Application olarak verin.

  2. Şimdi, CrossSite_RequestForgery uygulamasının Web Config uygulamasını açın ve bağlantı dizesini aşağıda verilenle değiştirin ve kaydedin.

'

<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF;
Integrated Security=true;" providerName="System.Data.SqlClient" /> 
 </connectionStrings>
  1. Şimdi Araçlar >> NuGet Paket Yöneticisi'ni ve ardından Paket Yöneticisi Konsolu'nu tıklayın

  2. Şimdi, veritabanı oluşturmak için Paket Yöneticisi Konsolu'nda aşağıda belirtilen üç komutu çalıştırın.

Etkinleştir-Geçişler ekleme-taşıma ilk güncelleme-veritabanı

Önemli Notlar - Ben geliştiriciler çalışma şeklinde bu örnek yapmak istiyorum çünkü kod ilk yaklaşım ile veritabanı oluşturduk. El ile veritabanı da oluşturabilirsiniz. Seçim senin.

  1. Şimdi Hesap Denetleyicisi'ni açın. Burada, türü yazı olan bir kayıt yöntemi göreceksiniz. Bu yöntemin üzerinde, [ValidateAntiForgeryToken] olarak kullanılabilen bir özellik bulunmalıdır. Bu özelliği yorumlayın. Şimdi, kaydı sağ tıklayın ve Görüntüle'ye tıklayın. Burada yine html yardımcısı @ Html.AntiForgeryToken () olarak bulacaksınız. Bunu da yorumlayın. Uygulamayı çalıştırın ve kayıt düğmesine tıklayın. URL şu şekilde açılacaktır:

http: // localhost: 52269 / Hesap / Kayıt

Notlar - Artık tüm okuyucuların kafasında sorulan sorunun, bu istekleri doğrulamak için herkesin bildiğinden, bu iki yardımcıya neden yorum yapılması gerektiğini biliyorum. O zaman, hepinize bunun bunun sadece yardımcıları uygulamadan önce ve sonra farkı göstermek istediğim için olduğunu bildirmek istiyorum.

  1. Şimdi, Attack_Application olan ikinci uygulamayı açın. Ardından, Hesap Denetleyicisi'nin Kayıt yöntemini açın. POST yöntemini aşağıda gösterilen basit yöntemle değiştirmeniz yeterlidir.

    Kayıt formu
    1. @ Html.LabelFor (m => m.UserName) @ Html.TextBoxFor (m => m.UserName)
    2. @ Html.LabelFor (m => m.Şifre) @ Html.PasswordFor (m => m.Şifre)
    3. @ Html.LabelFor (m => m.ConfirmPassword) @ Html.PasswordFor (m => m.ConfirmPassword)

7.Şimdi, bir hacker olduğunuzu ve CrossSite_RequestForgery uygulamasında kullanıcıyı kaydedebileceğiniz URL'yi bildiğinizi varsayalım. Şimdi, Attacker_Application olarak bir Forgery sitesi oluşturdunuz ve aynı URL'yi yazı yöntemine koydunuz.

8. Şimdi bu uygulamayı çalıştırın ve kayıt alanlarını doldurun ve kayıt tıklayın. CrossSite_RequestForgery uygulamasında kayıtlı olduğunuzu göreceksiniz. CrossSite_RequestForgery uygulamasının veritabanını kontrol ederseniz, girmiş olduğunuz girişi ve girişi göreceksiniz.

  1. Önemli - Şimdi, CrossSite_RequestForgery uygulamasını açın ve Hesap Denetleyicisi'nde jetonu yorumlayın ve Görünümü kaydedin. Aynı işlemle tekrar kaydolmayı deneyin. Ardından, aşağıdaki gibi bir hata oluşacaktır.

'/' Uygulamasında Sunucu Hatası ________________________________________ Gerekli sahtecilik karşıtı çerez "__RequestVerificationToken" mevcut değil.

Kavram böyle söylüyor. Görünüm'e eklediğimiz şey @ Html.AntiForgeryToken () yükleme zamanında __RequestVerificationToken ve Controller yönteminde kullanılabilir [ValidateAntiForgeryToken] üretir. Bu simgeyi yayın tarihinde eşleştirin. Jeton aynıysa, bunun geçerli bir istek olduğu anlamına gelir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.