Cel, uzasadnienie i przykład ValidateAntiForgeryToken

310

Czy możesz wyjaśnić cel ValidateAntiForgeryToken i pokazać mi przykład ValidateAntiForgeryTokenw MVC 4?

Nie mogłem znaleźć przykładów wyjaśniających ten atrybut?

Tabriz Atayi
źródło
8
Sprawdź ten post prideparrot.com/blog/archive/2012/7/…
VJAI
1
Nawiasem mówiąc, naprawdę nie rozumiem, dlaczego stwardnienie rozsiane nie umożliwiło umieszczenia tego w środku .BeginFormpomocnika. Tak więc ta rzecz jest dostępna automatycznie, jak w Rails
jazzcat

Odpowiedzi:

350

Obsługa zapobiegania fałszerstwom MVC zapisuje unikalną wartość do pliku cookie obsługującego tylko HTTP, a następnie ta sama wartość jest zapisywana w formularzu. Po przesłaniu strony pojawia się błąd, jeśli wartość pliku cookie nie zgadza się z wartością formularza.

Należy pamiętać, że ta funkcja zapobiega fałszowaniu żądań w różnych witrynach . Oznacza to, że formularz z innej witryny publikuje w Twojej witrynie próbę przesłania ukrytej treści przy użyciu poświadczeń uwierzytelnionego użytkownika. Atak polega na nakłonieniu zalogowanego użytkownika do przesłania formularza lub po prostu programowym uruchomieniu formularza podczas ładowania strony.

Ta funkcja nie zapobiega atakom polegającym na fałszowaniu danych lub manipulowaniu danymi.

Aby go użyć, udekoruj metodę akcji lub kontroler ValidateAntiForgeryTokenatrybutem i umieść wywołanie @Html.AntiForgeryToken()w formularzu wysyłającym wiadomość do metody.

Richard Szalay
źródło
5
@Chris To jedno i drugie. Zgodnie z moją odpowiedzią: „zapisuje unikalną wartość w pliku cookie obsługującym tylko HTTP, a następnie ta sama wartość jest zapisywana w formularzu
Richard Szalay
21
Dlaczego nie jest to ustawione domyślnie?
Christian Hagelid
12
@Christian, ponieważ nie jest to Ruby on Rails. ;-)
Martin Capodici
6
Wygląda na to, że forma __RequestVerificationToken i plik cookie __RequestVerificationToken nie są takie same, działają one jako para.
WaiKit Kung
5
@rdans W ogóle CORS i CSRF są zupełnie inne. CORS pozwala innym domenom na dostęp do interfejsów API na twoim serwerze, CSRF polega na upewnieniu się, że post został wysłany ze strony, której się spodziewałeś.
Richard Szalay
52

Podstawowym celem atrybutu ValidateAntiForgeryToken jest zapobieganie atakom polegającym na fałszowaniu żądań w różnych witrynach.

Fałszowanie żądań między witrynami to atak, w którym szkodliwy element skryptu, złośliwe polecenie lub kod są wysyłane z przeglądarki zaufanego użytkownika. Więcej informacji na ten temat można znaleźć na stronie http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages .

Jest prosty w użyciu, musisz ozdobić metodę za pomocą atrybutu ValidateAntiForgeryToken, jak poniżej:

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

Wywodzi się z przestrzeni nazw System.Web.Mvc.

Twoim zdaniem dodaj ten kod, aby dodać token, dzięki czemu będzie on używany do sprawdzania poprawności formularza po przesłaniu.

@Html.AntiForgeryToken()
Chandra Malla
źródło
Tak, masz rację, musisz wywołać @ Html.AntiForgeryToken () z formularza i dodać ValidateAntiForgeryTokenAttribute do metody akcji, którą chcesz chronić.
Chandra Malla
Dzięki za tę prostą do zrozumienia odpowiedź :)
noobprogrammer
4

W programie ASP.Net Core token zapobiegający fałszowaniu jest automatycznie dodawany do formularzy, więc nie trzeba go dodawać, @Html.AntiForgeryToken()jeśli używasz elementu formy brzytwy lub jeśli używasz IHtmlHelper.BeginForm i jeśli metoda formularza nie jest GET.

Wygeneruje element wejściowy dla formularza podobny do tego: <input name="__RequestVerificationToken" type="hidden" value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">

A gdy użytkownik prześle formularz, ten token jest weryfikowany po stronie serwera, jeśli włączono sprawdzanie poprawności.

[ValidateAntiForgeryToken]atrybutu można użyć przeciwko działaniom. Żądania dotyczące działań, w których zastosowano ten filtr, są blokowane, chyba że żądanie zawiera prawidłowy token antygraniczny.

[AutoValidateAntiforgeryToken]atrybut może być użyty przeciwko kontrolerom. Ten atrybut działa identycznie jak atrybut ValidateAntiForgeryToken, z tym wyjątkiem, że nie wymaga tokenów dla żądań wykonanych przy użyciu następujących metod HTTP: GET HEAD OPTIONS TRACE

Informacje dodatkowe: https://docs.microsoft.com/pl-pl/aspnet/core/security/anti-request-forgery

nożyczki
źródło
2

Microsoft zapewnia nam wbudowaną funkcjonalność, której używamy w naszej aplikacji do celów bezpieczeństwa, więc nikt nie może włamać się na naszą stronę ani atakować niektórych ważnych informacji.

Z celu ValidateAntiForgeryToken w aplikacji MVC firmy Harpreet Singh:

Zastosowanie ValidateAntiForgeryToken

Spróbujmy na prostym przykładzie, aby zrozumieć tę koncepcję. Nie chcę, aby było to zbyt skomplikowane, dlatego zamierzam użyć szablonu aplikacji MVC, który jest już dostępny w Visual Studio. Zrobimy to krok po kroku. Zaczynajmy.

  1. Krok 1 - Utwórz dwie aplikacje MVC z domyślnym szablonem internetowym i nadaj te nazwy odpowiednio CrossSite_RequestForgery i Attack_Application.

  2. Teraz otwórz Web Config aplikacji CrossSite_RequestForgery i zmień parametry połączenia na podane poniżej, a następnie zapisz.

`

<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF;
Integrated Security=true;" providerName="System.Data.SqlClient" /> 
 </connectionStrings>
  1. Teraz kliknij Narzędzia >> NuGet Package Manager, a następnie Konsola Menedżera pakietów

  2. Teraz uruchom poniższe trzy polecenia w konsoli Menedżera pakietów, aby utworzyć bazę danych.

Enable-Migrations add -igration pierwsza aktualizacja-baza danych

Ważne uwagi - Stworzyłem bazę danych z pierwszym podejściem do kodu, ponieważ chcę zrobić ten przykład w sposób, w jaki działają programiści. Możesz także ręcznie utworzyć bazę danych. To Twój wybór.

  1. Teraz otwórz Kontrolera konta. Tutaj zobaczysz metodę rejestracji, której typem jest post. Powyżej tej metody powinien być dostępny atrybut jako [ValidateAntiForgeryToken]. Skomentuj ten atrybut. Teraz kliknij prawym przyciskiem myszy na rejestr i kliknij przejdź do widoku. Tam ponownie znajdziesz pomocnika HTML jako @ Html.AntiForgeryToken (). Skomentuj również ten. Uruchom aplikację i kliknij przycisk Zarejestruj. Adres URL zostanie otwarty jako:

http: // localhost: 52269 / Konto / Zarejestruj się

Notatki - wiem, że pytanie, które pojawia się w głowach wszystkich czytelników, brzmi: dlaczego tych dwóch pomocników należy skomentować, ponieważ wszyscy wiedzą, że są one używane do zatwierdzenia żądania. Następnie chcę wam wszystkim powiedzieć, że dzieje się tak tylko dlatego, że chcę pokazać różnicę przed zastosowaniem tych pomocników i przed nimi.

  1. Teraz otwórz drugą aplikację, którą jest Attack_Application. Następnie otwórz Zarejestruj metodę Kontrolera konta. Po prostu zmień metodę POST na prostą, pokazaną poniżej.

    Formularz rejestracyjny
    1. @ Html.LabelFor (m => m.UserName) @ Html.TextBoxFor (m => m.UserName)
    2. @ Html.LabelFor (m => m.Password) @ Html.PasswordFor (m => m.Password)
    3. @ Html.LabelFor (m => m.ConfirmPassword) @ Html.PasswordFor (m => m.ConfirmPassword)

7. Załóżmy, że jesteś hakerem i znasz adres URL, z którego możesz zarejestrować użytkownika w aplikacji CrossSite_RequestForgery. Teraz utworzyłeś witrynę Forgery jako Attacker_Application i po prostu umieściłeś ten sam adres URL w metodzie post.

8. Uruchom teraz tę aplikację, wypełnij pola rejestru i kliknij rejestr. Zobaczysz, że jesteś zarejestrowany w aplikacji CrossSite_RequestForgery. Jeśli sprawdzisz bazę danych aplikacji CrossSite_RequestForgery, zobaczysz i wprowadziłeś wpis.

  1. Ważne - Teraz otwórz aplikację CrossSite_RequestForgery i skomentuj token w kontrolerze konta i zarejestruj widok. Spróbuj zarejestrować się ponownie w tym samym procesie. Następnie wystąpi błąd, jak poniżej.

Błąd serwera w aplikacji „/”. ________________________________________ Wymagany plik cookie zapobiegający fałszowaniu „__RequestVerificationToken” nie jest obecny.

Tak mówi koncepcja. Co dodajemy w View tj. @ Html.AntiForgeryToken () generuje __RequestVerificationToken w czasie ładowania i [ValidateAntiForgeryToken] dostępny w metodzie Controller. Dopasuj ten token na czas postu. Jeśli token jest taki sam, oznacza to, że jest to prawidłowe żądanie.

Vinayak Savale
źródło
3
skopiowane z c-sharpcorner.com/article/…
Mohammed Dawood Ansari