ConvalidaAntiForgeryTenuto scopo, spiegazione ed esempio


310

Potresti spiegare lo scopo di ValidateAntiForgeryToken e mostrarmi un esempio ValidateAntiForgeryTokenin MVC 4?

Non sono riuscito a trovare esempi che spiegano questo attributo?



1
A proposito, non capisco davvero perché la SM non abbia reso possibile metterlo proprio .BeginFormnell'aiutante. Quindi questa cosa è lì automaticamente, come in Rails
jazzcat,

Risposte:


350

Il supporto anti-contraffazione di MVC scrive un valore univoco in un cookie solo HTTP e quindi lo stesso valore viene scritto nel modulo. Quando viene inviata la pagina, viene generato un errore se il valore del cookie non corrisponde al valore del modulo.

È importante notare che la funzionalità impedisce falsi di richieste tra siti . Cioè, un modulo da un altro sito che pubblica sul tuo sito nel tentativo di inviare contenuti nascosti utilizzando le credenziali di un utente autenticato. L'attacco consiste nel indurre l'utente che ha effettuato l'accesso a inviare un modulo o semplicemente attivando a livello di codice un modulo al caricamento della pagina.

La funzione non impedisce nessun altro tipo di falsificazione dei dati o attacchi basati sulla manomissione.

Per usarlo, decorare il metodo di azione o il controller con l' ValidateAntiForgeryTokenattributo e effettuare una chiamata @Html.AntiForgeryToken()nei moduli che inviano al metodo.


5
@ Chris È entrambi. Secondo la mia risposta: "scrive un valore univoco in un cookie solo HTTP e quindi lo stesso valore viene scritto nel modulo "
Richard Szalay,

21
Perché questo non è impostato di default?
Christian Hagelid,

12
@Christian perché non è Ruby on Rails. ;-)
Martin Capodici il

6
Sembra che il modulo __RequestVerificationToken e il cookie __RequestVerificationToken non siano gli stessi, funzionano in coppia.
WaiKit Kung,

5
@rdans Niente affatto, CORS e CSRF sono completamente diversi. CORS è per consentire ad altri domini di accedere alle API sul tuo server, CSRF significa assicurarsi che un post del modulo provenga dalla pagina che ti aspettavi.
Richard Szalay,

52

Lo scopo di base dell'attributo ValidateAntiForgeryToken è prevenire attacchi contraffatti di richieste tra siti.

Una contraffazione di richieste tra siti è un attacco in cui un elemento di script, un comando o un codice dannoso viene inviato dal browser di un utente attendibile. Per ulteriori informazioni al riguardo, visitare http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages .

È semplice da usare, è necessario decorare il metodo con l'attributo ValidateAntiForgeryToken come di seguito:

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

Deriva dallo spazio dei nomi System.Web.Mvc.

A tuo avviso, aggiungi questo codice per aggiungere il token in modo che venga utilizzato per convalidare il modulo al momento dell'invio.

@Html.AntiForgeryToken()

Sì, hai ragione, è necessario chiamare @ Html.AntiForgeryToken () dal modulo e aggiungere ValidateAntiForgeryTokenAttribute al metodo di azione che si desidera proteggere.
Chandra Malla,

Grazie per questa semplice risposta :)
noobprogrammer

4

In ASP.Net Core il token anti-falsificazione viene aggiunto automaticamente ai moduli, quindi non è necessario aggiungerlo @Html.AntiForgeryToken() se si utilizza l'elemento del modulo rasoio o se si utilizza IHtmlHelper.BeginForm e se il metodo del modulo non è GET.

Genererà un elemento di input per il tuo modulo simile a questo: <input name="__RequestVerificationToken" type="hidden" value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">

E quando l'utente invia il modulo, questo token viene verificato sul lato server se la convalida è abilitata.

[ValidateAntiForgeryToken]l'attributo può essere usato contro le azioni. Le richieste fatte alle azioni a cui è applicato questo filtro vengono bloccate a meno che la richiesta non includa un token antiforgery valido.

[AutoValidateAntiforgeryToken]l'attributo può essere usato contro i controller. Questo attributo funziona in modo identico all'attributo ValidateAntiForgeryToken, tranne per il fatto che non richiede token per le richieste effettuate utilizzando i seguenti metodi HTTP: GET HEAD OPTIONS TRACE

Ulteriori informazioni: https://docs.microsoft.com/pl-pl/aspnet/core/security/anti-request-forgery


2

Microsoft ci fornisce funzionalità integrate che utilizziamo nella nostra applicazione per motivi di sicurezza, quindi nessuno può hackerare il nostro sito o invadere alcune informazioni critiche.

Da Purpose Of ValidateAntiForgeryToken In MVC Application di Harpreet Singh:

Uso di ValidateAntiForgeryToken

Proviamo con un semplice esempio per capire questo concetto. Non voglio renderlo troppo complicato, ecco perché userò un modello di un'applicazione MVC, già disponibile in Visual Studio. Lo faremo passo dopo passo. Iniziamo.

  1. Passaggio 1: creare due applicazioni MVC con modello Internet predefinito e assegnare quei nomi rispettivamente come CrossSite_RequestForgery e Attack_Application.

  2. Ora, apri Web Config dell'applicazione CrossSite_RequestForgery e modifica la stringa di connessione con quella indicata di seguito, quindi salva.

`

<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF;
Integrated Security=true;" providerName="System.Data.SqlClient" /> 
 </connectionStrings>
  1. Ora, fai clic su Strumenti >> NuGet Package Manager, quindi Package Manager Console

  2. Ora, esegui i tre comandi di seguito indicati nella Console Gestione pacchetti per creare il database.

Enable-Migrations add-migrazione primo database di aggiornamento

Note importanti - Ho creato un database con il primo approccio al codice perché voglio fare questo esempio nel modo in cui funzionano gli sviluppatori. È inoltre possibile creare database manualmente. È la vostra scelta.

  1. Ora apri Account Controller. Qui vedrai un metodo di registrazione il cui tipo è post. Sopra questo metodo, dovrebbe essere disponibile un attributo come [ValidateAntiForgeryToken]. Commenta questo attributo. Ora, fai clic con il tasto destro sul registro e fai clic su Vai a Visualizza. Di nuovo, troverai un aiuto html come @ Html.AntiForgeryToken (). Commenta anche questo. Esegui l'applicazione e fai clic sul pulsante di registrazione. L'URL sarà aperto come:

http: // localhost: 52.269 / Account / Register

Note - Ora so che la domanda che viene sollevata nella mente di tutti i lettori è perché questi due aiutanti debbano essere commentati, poiché tutti sanno che vengono utilizzati per convalidare la richiesta. Quindi, voglio solo farvi sapere che questo è solo perché voglio mostrare la differenza dopo e prima di applicare questi helper.

  1. Ora apri la seconda applicazione che è Attack_Application. Quindi, apri il metodo Register di Account Controller. Basta cambiare il metodo POST con quello semplice, mostrato di seguito.

    Modulo di registrazione
    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. Ora supponiamo di essere un hacker e di conoscere l'URL da cui è possibile registrare l'utente nell'applicazione CrossSite_RequestForgery. Ora, hai creato un sito di Forgery come Attacker_Application e hai appena inserito lo stesso URL nel metodo post.

8.Esegui ora questa applicazione e compila i campi del registro e fai clic su Registra. Vedrai che sei registrato nell'applicazione CrossSite_RequestForgery. Se controlli il database dell'applicazione CrossSite_RequestForgery, vedrai e inserirai la voce che hai inserito.

  1. Importante: ora apri l'applicazione CrossSite_RequestForgery e commenta il token in Account Controller e registra la vista. Prova a registrarti di nuovo con lo stesso processo. Quindi, si verificherà un errore come di seguito.

Errore del server nell'applicazione '/' ________________________________________ Il cookie anti-contraffazione richiesto "__RequestVerificationToken" non è presente.

Questo è ciò che dice il concetto. Quello che aggiungiamo in View ie @ Html.AntiForgeryToken () genera __RequestVerificationToken sul tempo di caricamento e [ValidateAntiForgeryToken] disponibile sul metodo Controller. Abbina questo token al momento della pubblicazione. Se il token è lo stesso, significa che si tratta di una richiesta valida.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.