Finalidade, explicação e exemplo do ValidateAntiForgeryToken

310

Você poderia explicar a finalidade do ValidateAntiForgeryToken e me mostrar um exemplo sobre o ValidateAntiForgeryTokenMVC 4?

Não encontrei nenhum exemplo que explique esse atributo?

Tabriz Atayi
fonte
8
Verifique esta publicação prideparrot.com/blog/archive/2012/7/…
VJAI
1
A propósito, eu realmente não entendo por que a MS não tornou possível colocar isso dentro do .BeginFormajudante. Então, essa coisa está lá automaticamente, como no Rails
jazzcat

Respostas:

350

O suporte antifalsificação do MVC grava um valor exclusivo em um cookie somente HTTP e, em seguida, o mesmo valor é gravado no formulário. Quando a página é enviada, um erro é gerado se o valor do cookie não corresponder ao valor do formulário.

É importante observar que o recurso evita falsificações de solicitação entre sites . Ou seja, um formulário de outro site que é postado no seu site na tentativa de enviar conteúdo oculto usando as credenciais de um usuário autenticado. O ataque envolve enganar o usuário conectado para enviar um formulário ou simplesmente acionar programaticamente um formulário quando a página é carregada.

O recurso não impede qualquer outro tipo de falsificação de dados ou ataques baseados em adulteração.

Para usá-lo, decore o método de ação ou o controlador com o ValidateAntiForgeryTokenatributo e faça uma chamada @Html.AntiForgeryToken()nos formulários lançados no método.

Richard Szalay
fonte
5
@ Chris São os dois. Como por minha resposta: "escreve um valor único para um HTTP-only cookie e, em seguida, o mesmo valor é escrito para a forma "
Richard Szalay
21
Por que isso não está definido por padrão?
Christian Hagelid
12
@ Christian, porque não é Ruby on Rails. ;-)
Martin Capodici
6
Parece que o formulário __RequestVerificationToken e o cookie __RequestVerificationToken não são os mesmos, eles funcionam como um par.
WaiKit Kung
5
@rdans De maneira alguma, CORS e CSRF são totalmente diferentes. O CORS é para permitir que outros domínios acessem APIs em seu servidor, o CSRF trata de garantir que uma postagem de formulário seja proveniente da página que você esperava.
Richard Szalay
52

O objetivo básico do atributo ValidateAntiForgeryToken é impedir ataques de falsificação de solicitação entre sites.

Uma falsificação de solicitação entre sites é um ataque no qual um elemento de script prejudicial, comando malicioso ou código é enviado do navegador de um usuário confiável. Para obter mais informações, visite http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages .

É simples de usar, você precisa decorar o método com o atributo ValidateAntiForgeryToken como abaixo:

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

É derivado do espaço para nome System.Web.Mvc.

E, na sua opinião, adicione esse código para adicionar o token, para que ele seja usado para validar o formulário após o envio.

@Html.AntiForgeryToken()
Chandra Malla
fonte
Sim, você está certo, é necessário chamar @ Html.AntiForgeryToken () do seu formulário e adicionar o ValidateAntiForgeryTokenAttribute ao método de ação que você deseja proteger.
Chandra Malla
Obrigado por esta simples de entender resposta :)
noobprogrammer
4

No token anti-falsificação do ASP.Net Core é automaticamente adicionado aos formulários, portanto, não é necessário adicionar @Html.AntiForgeryToken()se você usa o elemento de formulário naval ou se usa IHtmlHelper.BeginForm e se o método do formulário não é GET.

Ele irá gerar um elemento de entrada para seu formulário semelhante a este: <input name="__RequestVerificationToken" type="hidden" value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">

E quando o usuário envia o formulário, esse token é verificado no servidor, se a validação estiver ativada.

[ValidateAntiForgeryToken]O atributo pode ser usado contra ações. As solicitações feitas às ações que têm esse filtro aplicado são bloqueadas, a menos que a solicitação inclua um token antiforgery válido.

[AutoValidateAntiforgeryToken]O atributo pode ser usado nos controladores. Este atributo funciona de forma idêntica ao atributo ValidateAntiForgeryToken, exceto que não requer tokens para solicitações feitas usando os seguintes métodos HTTP: GET HEAD OPTIONS TRACE

Informações adicionais: https://docs.microsoft.com/pl-pl/aspnet/core/security/anti-request-forgery

tscissors
fonte
2

A Microsoft nos fornece funcionalidades internas que usamos em nosso aplicativo para fins de segurança, para que ninguém possa invadir nosso site ou invadir algumas informações críticas.

Do objetivo do ValidateAntiForgeryToken no aplicativo MVC por Harpreet Singh:

Uso de ValidateAntiForgeryToken

Vamos tentar com um exemplo simples para entender esse conceito. Não quero tornar isso muito complicado, é por isso que vou usar o modelo de um aplicativo MVC, já disponível no Visual Studio. Faremos isso passo a passo. Vamos começar.

  1. Etapa 1 - Crie dois aplicativos MVC com o modelo padrão da Internet e dê esses nomes como CrossSite_RequestForgery e Attack_Application, respectivamente.

  2. Agora, abra a Configuração da Web do aplicativo CrossSite_RequestForgery e altere a cadeia de conexão com a fornecida abaixo e salve.

`

<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF;
Integrated Security=true;" providerName="System.Data.SqlClient" /> 
 </connectionStrings>
  1. Agora, clique em Ferramentas >> Gerenciador de Pacotes NuGet e, em seguida, Console do Gerenciador de Pacotes

  2. Agora, execute os três comandos abaixo mencionados no Package Manager Console para criar o banco de dados.

Enable-Migrations add-migration primeiro update-database

Observações importantes - Criei um banco de dados com a primeira abordagem de código, porque quero fazer esse exemplo na maneira como os desenvolvedores trabalham. Você também pode criar banco de dados manualmente. É a sua escolha.

  1. Agora, abra o Account Controller. Aqui, você verá um método de registro cujo tipo é post. Acima desse método, deve haver um atributo disponível como [ValidateAntiForgeryToken]. Comente este atributo. Agora, clique com o botão direito no registro e clique em Exibir. Mais uma vez, você encontrará um auxiliar html como @ Html.AntiForgeryToken (). Comente este também. Execute o aplicativo e clique no botão registrar. O URL será aberto como:

http: // localhost: 52269 / Conta / Registro

Observações - Agora eu sei que a pergunta que está sendo levantada na mente de todos os leitores é por que esses dois auxiliares precisam ser comentados, pois todos sabem que eles são usados ​​para validar a solicitação. Quero apenas que todos saibam que isso é apenas porque quero mostrar a diferença depois e antes de aplicar esses auxiliares.

  1. Agora, abra o segundo aplicativo, que é Attack_Application. Em seguida, abra o método Register do Account Controller. Basta alterar o método POST pelo simples, mostrado abaixo.

    Formulário de registro
    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.Agora, suponha que você seja um hacker e saiba o URL de onde pode registrar o usuário no aplicativo CrossSite_RequestForgery. Agora, você criou um site Forgery como Attacker_Application e apenas colocou o mesmo URL no método post.

8.Run esta aplicação agora e preencha os campos de registro e clique em registrar. Você verá que está registrado no aplicativo CrossSite_RequestForgery. Se você verificar o banco de dados do aplicativo CrossSite_RequestForgery, verá a entrada inserida.

  1. Importante - Agora, abra o aplicativo CrossSite_RequestForgery e comente o token no Account Controller e registre a View. Tente se registrar novamente com o mesmo processo. Em seguida, ocorrerá um erro como abaixo.

Erro de Servidor na '/' Aplicação. ________________________________________ O cookie anti-falsificação necessário "__RequestVerificationToken" não está presente.

É isso que o conceito diz. O que adicionamos no modo de exibição, por exemplo, @ Html.AntiForgeryToken () gera __RequestVerificationToken no tempo de carregamento e [ValidateAntiForgeryToken] disponível no método Controller. Combine esse token na hora da postagem. Se o token for o mesmo, significa que esta é uma solicitação válida.

Vinayak Savale
fonte
3
copiado de c-sharpcorner.com/article/...
Mohammed Dawood Ansari