ASP.NET solicitar proteção de falsificação (XSRF/CSRF) neste núcleo
Ambiente
- Estúdio Visual
-
- Visual Studio 2019
- núcleo ASP.NET
-
- 3.0
- 3.1
O que é falsificação de solicitação entre sites?
A falsificação de solicitação entre sites (CSRF/XSRF) é para aqueles que são processados apenas dentro do site de interesse. Um ataque a uma vulnerabilidade que executa tal processo de atualização a partir de um site externo.
Por exemplo, suponha que você tenha a capacidade de postar comentários em um site. Normalmente, eu acho que você vai postar inserindo um comentário do site, Esse processo de envio é mais frequentemente usado para jogar dados na URL de destino.
Portanto, se você enviar dados semelhantes à URL de alguém que não seja o site de destino, É o mesmo tratamento que você postou.
Se ao menos um atacante fizesse isso, não seria uma ameaça. A coisa assustadora sobre o CSRF é que os atacantes podem construir sites falsos ou incorporar URLs escondidas no site. É onde outra pessoa o acessa sem querer e se torna um atacante.
Eu não vou entrar em profundidade aqui, então, por favor, descubra mais sobre a falsificação de pedidos entre sites.
ASP.NET Core incorpora essa contramedida no quadro.
Verifique a falsificação de solicitação entre sites para funcionar
Tente ver se o processo de atualização é realmente realizado a partir de sites ou ferramentas externas.
Index.cshtml cria um formulário de entrada que envia o texto que você inseriu para o servidor. Em seguida, coloque os dados de exibição para que o servidor exiba mensagens criadas para corresponder ao texto de entrada.
Index.cshtml
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
<form method="post">
<input type="text" name="text" />
<button type="submit">送信</button>
</form>
<p>@ViewData["Message"]</p>
O lado do servidor HomeController.cs processa o texto enviado e o envia para um rastreamento do Visual Studio. Defina o mesmo texto para ViewData para que ele possa ser exibido para o cliente.
HomeController.cs
public class HomeController : Controller
{
// 省略
[HttpPost]
public IActionResult Index(string text)
{
System.Diagnostics.Trace.WriteLine($"「{text}」が入力されました。");
ViewData["Message"] = $"「{text}」が入力されました。";
return View();
}
// 省略
}
Tente executar a funcionalidade que você acabou de criar nas etapas normais. Quando você executar a depuração e a tela aparecer, digite o texto e clique no botão Enviar.
O texto processado aparece na tela como esperado.
Como também é saída para o rastreamento, a janela de saída do estúdio visual também exibe texto. Na verdade, fazemos coisas como registrar dados de entrada em um banco de dados, mas não vamos simplificar o código aqui.
Agora, tente acessar o programa de fora do local de destino enquanto depura e executa. Para simplificar, vou postar um post usando uma ferramenta chamada Visual Studio Code. Se você pode enviar POST, você pode usar outras ferramentas ou construir outro programa de site para o ataque.
Quando você instala uma extensão chamada REST Client no Visual Studio Code, Você pode usar um recurso que permite verificar facilmente o funcionamento da API REST apenas abrindo o arquivo .http.
Quando você cria um arquivo .http semelhante ao seguinte em um arquivo de texto e, em seguida, abre o arquivo no Visual Studio Code, Você pode enviar GET ou POST clicando em enviar solicitação.
Se você criar os seguintes dados POST, você será enviado quase a mesma quantidade de dados que você digita texto na tela e pressiona o botão enviar. (O número da porta localhost deve ser o mesmo do ambiente de execução.)
RestTest.http://www.restTest.http
### Form で POST 送信
POST https://localhost:44372/home/index HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="text"
なんらかのテキスト
------WebKitFormBoundary7MA4YWxkTrZu0gW--
Ao enviá-lo, você pode ver que o servidor está recebendo texto e processando-o.
Visual Studio Code pode obter os resultados. Se você der uma olhada mais de perto no código de resultado, poderá ver que o valor definido para ViewData é exibido. (É exibido no Unicode, mas o texto é exibido corretamente se visualizado em um navegador da Web.)
Endereçar vulnerabilidade de falsificação de solicitação entre sites
Como mencionei no início, ASP.NET Core incorpora medidas contra a falsificação de solicitações entre sites no quadro. Uma medida comum é emitir um token exclusivo para o cliente com antecedência em uma tela que requer postagem, etc. Você não precisa aceitar o processamento a menos que jogue o token no servidor.
Claro, se você acessar a URL diretamente de um site externo, o token é desconhecido e não aceitará processamento.
Primeiro, gostaria de falar sobre a emissão de tokens para o cliente (HTML), mas o fato é que a estrutura não é capaz de fazer isso. Will vai embora. Se você especificar um método POST na tag de formulário, você pode incorporar parâmetros de token em HTML sem permissão.
No HTML abaixo, é o nome de entrada="__RequestVerificationToken" tipo="oculto". Isso é enviado ao servidor quando o botão enviar é pressionado. A propósito, ele não é anexado pelo método GET.
No lado do servidor, Startup.cs serviços. AdicionarControladoresComVisualizações opções de método. Filtros para AutoValidAAntiforgeryTokenAttribute, todas as ações Essa verificação de token é adicionada automaticamente (para ser exato, apenas os métodos HTTP de POST, PUT, PATCH e DELETE).
Se você quiser adicionar essa restrição apenas a ações específicas, não todas as ações, por controlador, por ação Também é possível definir.
Por outro lado, se você quiser impor restrições à maioria das ações, mas você quer excluir ações específicas, Se você definir o atributo IgnoreAntiforgeryToken para o controlador e a ação, ele está OK.
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(options =>
{
// 全ての「POST, PUT, PATCH, DELETE」アクションに自動で ValidateAntiForgeryToken を付与。
// 個別に除外したい場合は「IgnoreAntiforgeryToken」属性を指定すること
// API では HTML 側にトークンを発行できないのでコントローラーに「IgnoreAntiforgeryToken」を指定する必要がある。
options.Filters.Add(new Microsoft.AspNetCore.Mvc.AutoValidateAntiforgeryTokenAttribute());
});
}
Vamos ver como funciona. Em primeiro lugar, o processo de transmissão é feito a partir da tela normalmente.
Os resultados foram refletidos na tela como esperado.
Também é saída para o rastreamento.
Agora, vamos tentar acessá-lo de fora.
Acesse, mas a solicitação ruim foi devolvida. É um resultado diferente do que quando você não está tomando medidas. Entende-se que ele é guardado porque não é saída para o rastreamento.
Resumo
Desta vez tentei implementar medidas contra a falsificação de pedidos entre sites. Foi muito fácil de implementar porque já estava incorporado no quadro.
Construir um site requer muito mais vulnerabilidade do que o CSRF. Você pode verificar o que está lá fora, ou pode usar ferramentas como o OWASP para verificar se há vulnerabilidades em seu site.