CSRF é uma atividade maliciosa realizada por um invasor, que executa ações em nome de um usuário autenticado, prejudicial à segurança da web. Felizmente, o Laravel fornece as ferramentas para evitar esse tipo de vulnerabilidade.
Os ataques CSRF sequestram as sessões do usuário. Eles fazem isso enganando um usuário para enviar uma solicitação por meio de tags de formulário ocultos ou URLs maliciosos (imagens ou links) sem o conhecimento do usuário.
Esse ataque leva a uma mudança no estado da sessão do usuário, vazamentos de dados e, às vezes, os hackers podem manipular os dados do usuário final em um aplicativo.
A imagem acima ilustra um cenário em que a segurança da Web é violada. A vítima envia uma solicitação clicando em um link (recebido), enviando uma solicitação a um servidor do site que produzirá os efeitos desejados pelo hacker, que passa a possuir as informações úteis para acessar e manipular o servidor do site.
Para melhorar o segurança web de suas aplicações, em cada sessão de usuário, o Laravel gera tokens seguros que ele usa para garantir que o usuário autenticado é aquele que solicita a aplicação.
Como esse token muda sempre que uma sessão do usuário é regenerada, um invasor não pode acessá-lo.
Sempre que houver uma solicitação para alterar as informações do usuário no lado do servidor (back-end), como POST
, PUT
, PATCH
e DELETE
, você deve incluir a diretiva @csrf
no formulário de solicitação blade
HTML. O @csrf
é, portanto, uma diretiva Blade
usado para gerar um token oculto validado pelo aplicativo.
A diretiva Blade
é a sintaxe usada no mecanismo de modelo do Laravel chamada Lâmina . Para criar um arquivo blade
você tem que dar um nome – no nosso caso formulário – seguido da extensão da lâmina. Isso significa que o arquivo terá o nome form.blade.php
.
O arquivo é usado blade
para renderizar exibições para usuários na página da Web. Há algumas pré-diretivasdefiSintaxe abreviada nite ou blade que você pode usar. Por exemplo, @if
verificar se uma condição é satisfeita, @empty
verifique se os registros não estão vazios, @auth
verifique se um usuário está autenticado e assim por diante.
Mas voltemos à directiva @csrf
. Veja como você o usa:
<form method="POST" action="{{route('pay')}}">
@csrf
</form>
As versões anteriores do Laravel tinham uma configuração diferente: ambos funcionam e fazem a mesma coisa.
<form method="POST" action="{{route('pay')}}">
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
Quando o token CSRF está faltando na solicitação de formulário que está sendo enviada ou se parece inválido, o Laravel lança uma mensagem de erro “Page Expired” com um código de status 419.
O middleware VerifyCsrfToken
lida com a verificação CSRF dentro do aplicativo Laravel. O middleware
está registrado em Kernel.php
e está localizado no diretório app/Http/Middleware
. Isso significa que o middleware
é disparado para requisições dentro da web, não relacionadas às APIs.
protected $middlewareGroups = [
'web' => [
.
.
.
.
.
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
O middleware VerifyCsrfToken estende a classe Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
, ou seja, a verificação CSRF é definito dentro da classe.
Vamos nos aprofundar para descobrir como o Laravel lida com a verificação CSRF.
Dentro da classe, temos a função tokensMatch
.
protected function tokensMatch($request)
{
$token = $this->getTokenFromRequest($request);
return is_string($request->session()->token()) &&
is_string($token) &&
hash_equals($request->session()->token(), $token);
}
no código determina se a sessão e os tokens CSRF de entrada correspondem.
A função faz duas coisas:
$this->getTokenFromRequest
o token da solicitação recebida anexada por meio de um campo oculto ou do cabeçalho da solicitação. O token é descriptografado e retornado à variável de token.protected function getTokenFromRequest($request)
{
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
try {
$token = CookieValuePrefix::remove($this->encrypter->decrypt($header, static::serialized()));
} catch (DecryptException $e) {
$token = '';
}
}
return $token;
}
No código, ele obtém o token do cabeçalho
2. Transmita o token de solicitação e a sessão para uma string e, em seguida, use hash_equals
construído em PHP para comparar se ambas as strings são iguais. O resultado desta operação é sempre bool (verdadeiro) ou (falso) .
Ercole Palmeri
Uma operação de oftalmoplastia usando o visualizador comercial Apple Vision Pro foi realizada na Policlínica Catania…
O desenvolvimento de habilidades motoras finas por meio da coloração prepara as crianças para habilidades mais complexas, como escrever. Colorir…
O setor naval é uma verdadeira potência económica global, que navegou para um mercado de 150 mil milhões...
Na segunda-feira passada, o Financial Times anunciou um acordo com a OpenAI. O FT licencia seu jornalismo de classe mundial…