bens

Laravel Web Security: O que é Cross-Site Request Forgery (CSRF)?

Neste tutorial do Laravel, falamos sobre segurança na Web e como proteger um aplicativo da Web contra ataques Cross-Site Request Forgery ou CSRF.

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.

O que é CSRF?

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.

Como evitar solicitações CSRF

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 POSTPUTPATCHDELETE, 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.

Boletim de inovação
Não perca as notícias mais importantes sobre inovação. Cadastre-se para recebê-los por e-mail.
<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.

Como e onde ocorre a verificação CSRF

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:

  1. pegar $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

Boletim de inovação
Não perca as notícias mais importantes sobre inovação. Cadastre-se para recebê-los por e-mail.

Artigos recentes

Intervenção inovadora em Realidade Aumentada, com visualizador Apple na Policlínica de Catânia

Uma operação de oftalmoplastia usando o visualizador comercial Apple Vision Pro foi realizada na Policlínica Catania…

3 Maio 2024

Os benefícios das páginas para colorir para crianças - um mundo de magia para todas as idades

O desenvolvimento de habilidades motoras finas por meio da coloração prepara as crianças para habilidades mais complexas, como escrever. Colorir…

2 Maio 2024

O futuro está aqui: como a indústria naval está revolucionando a economia global

O setor naval é uma verdadeira potência económica global, que navegou para um mercado de 150 mil milhões...

1 Maio 2024

Editoras e OpenAI assinam acordos para regular o fluxo de informações processadas por Inteligência Artificial

Na segunda-feira passada, o Financial Times anunciou um acordo com a OpenAI. O FT licencia seu jornalismo de classe mundial…

Abril 30 2024