ASP.NET solicitar proteção de falsificação (XSRF/CSRF) neste núcleo

Página atualizada :
Data de criação de página :

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.