- Introdução
- Prevenir Pedidos CSRF
- Excluindo URIs
- X-CSRF-Token
- X-XSRF-Token
Introdução
As falsificações de pedidos entre sites são um tipo de exploração maliciosa em que comandos não autorizados são executados em nome de um usuário autenticado. Felizmente, Laravel facilita a proteção de sua aplicação contra ataques de solicitação de falsificação cruzada de sites (CSRF).
Uma explicação da vulnerabilidade
No caso de você não estar familiarizado com falsificações de solicitação cruzada de sites, vamos discutir um exemplo de como essa vulnerabilidade pode ser explorada. Imagine que a sua aplicação tem uma rota /user/email
que aceita um pedido POST
para alterar o endereço de email do utilizador autenticado. Muito provavelmente, esta rota espera que um campo de entrada email
contenha o endereço de e-mail que o usuário gostaria de começar a usar.
Sem proteção CSRF, um site malicioso poderia criar um formulário HTML que apontasse para a rota /user/email
do seu aplicativo e enviasse o endereço de e-mail do próprio usuário malicioso:
<form action="https://your-application.com/user/email" method="POST"> <input type="email" value=""></form><script> document.forms.submit();</script>
Se o site malicioso enviar automaticamente o formulário quando a página for carregada, o usuário malicioso só precisará atrair um usuário insuspeito do seu aplicativo para visitar o site dele e o endereço de e-mail dele será alterado no seu aplicativo.
Para evitar essa vulnerabilidade, precisamos inspecionar cada entrada POST
, PUT
, PATCH
, ou DELETE
solicitação de um valor de sessão secreta que o aplicativo malicioso não consegue acessar.
Prevenir solicitações CSRF
Laravel gera automaticamente um “token” CSRF para cada sessão de usuário ativo gerenciada pelo aplicativo. Este token é usado para verificar se o usuário autenticado é a pessoa que realmente faz as solicitações para a aplicação. Como este token é armazenado na sessão do usuário e muda cada vez que a sessão é regenerada, um aplicativo malicioso não consegue acessá-lo.
O token CSRF da sessão atual pode ser acessado através da sessão da solicitação ou através da função helper:
use Illuminate\Http\Request;Route::get('/token', function (Request $request) { $token = $request->session()->token(); $token = csrf_token(); // ...});
Ainda que você defina um formulário HTML no seu aplicativo, você deve incluir um campo oculto CSRF _token
no formulário para que o middleware de proteção CSRF possa validar a solicitação. Por conveniência, você pode usar a diretiva @csrf
Blade para gerar o campo de entrada de token oculto:
<form method="POST" action="/profile"> @csrf <!-- Equivalent to... --> <input type="hidden" name="_token" value="{{ csrf_token() }}" /></form>
O middleware App\Http\Middleware\VerifyCsrfToken
, que está incluído no grupo web
middleware por padrão, verificará automaticamente se o token na entrada da requisição corresponde ao token armazenado na sessão. Quando estes dois tokens coincidem, sabemos que o usuário autenticado é o que inicia a requisição.
CSRF Tokens & SPAs
Se você está construindo um SPA que está utilizando Laravel como um backend de API, você deve consultar a documentação do Laravel Sanctum para informações sobre autenticação com sua API e proteção contra vulnerabilidades CSRF.
Excluir URIs da proteção do CSRF
Por vezes você pode desejar excluir um conjunto de URIs da proteção do CSRF. Por exemplo, se você está usando Stripe para processar pagamentos e está utilizando seu sistema de webhook, você precisará excluir sua rota do gerenciador de webhook Stripe da proteção CSRF já que Stripe não saberá qual token CSRF enviar para suas rotas.
Tipicamente, você deve colocar estes tipos de rotas fora do grupo web
middleware que o App\Providers\RouteServiceProvider
se aplica a todas as rotas no arquivo routes/web.php
. No entanto, você também pode excluir as rotas adicionando suas URIs à propriedade $except
do arquivo VerifyCsrfToken
middleware:
<?phpnamespace App\Http\Middleware;use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;class VerifyCsrfToken extends Middleware{ /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = ;}
{tip} Por conveniência, o middleware CSRF é automaticamente desabilitado para todas as rotas ao executar testes.
X-CSRF-TOKEN
Além de verificar o token CSRF como parâmetro POST, o middleware App\Http\Middleware\VerifyCsrfToken
também verificará o cabeçalho de requisição X-CSRF-TOKEN
. Você poderia, por exemplo, armazenar o token num HTML meta
tag:
<meta name="csrf-token" content="{{ csrf_token() }}">
Então, você pode instruir uma biblioteca como jQuery a adicionar automaticamente o token a todos os cabeçalhos de requisição. Isto fornece proteção CSRF simples e conveniente para seus aplicativos baseados em AJAX usando tecnologia JavaScript legada:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta').attr('content') }});
X-XSRF-TOKEN
Laravel armazena o token CSRF atual em um cookie criptografado XSRF-TOKEN
que é incluído com cada resposta gerada pela estrutura. Você pode usar o valor do cookie para definir o cabeçalho da requisição X-XSRF-TOKEN
.
Este cookie é enviado principalmente como uma conveniência do desenvolvedor já que algumas frameworks e bibliotecas JavaScript, como Angular e Axios, automaticamente colocam seu valor no cabeçalho X-XSRF-TOKEN
em requisições de mesma origem.