Banco de dúvidas

Como proteger seu site de ataques CSRF

O que é um ataque CSRF?

O CSRF (Cross-Site Request Forgery, ou falsificação de solicitação entre sites, em tradução livre) é um tipo de ataque em que, dependendo se um site foi programado sem as devidas precauções, um agente malicioso pode se aproveitar de uma má implementação do uso de cookies para enganar o browser de um usuário autenticado a executar ações indesejadas no site ou aplicativo sem que o usuário perceba. Isso acontece porque o browser da "vítima" já está autenticado no site e, portanto, possui permissões para realizar a ação. O ataque ocorre ao induzir o browser do usuário a enviar uma solicitação não autorizada sem seu consentimento.

Como evitar o CSRF

Felizmente, há várias medidas que os desenvolvedores podem tomar para proteger seus sites e aplicativos contra ataques CSRF. Aqui estão algumas práticas recomendadas:

  1. Use tokens de sessão (CSRF Tokens)

    Implemente tokens de sessão exclusivos para cada usuário autenticado e inclua esses tokens em todas as solicitações que modifiquem dados no servidor. O servidor pode verificar se o token é válido antes de processar a solicitação:

    <form action="/alterar_senha" method="post">
      <input type="hidden" name="csrf_token" value="token_unico_do_usuario">
      <!-- Resto dos campos do formulário -->
      <input type="submit" value="Alterar Senha">
    </form>
    
  2. Use o cabeçalho SameSite para cookies

    Configure os cookies para serem SameSite=Strict ou SameSite=Lax. Isso ajuda a limitar o compartilhamento de cookies entre sites diferentes, reduzindo a exposição a ataques CSRF. Por exemplo, no PHP é possível fazer isso com a função setcookie():

    <?php
    // definir SameSite como Strict diretamente na função setcookie
    setcookie('CookieBrilha', $valorDoCookie, [
        'expires' => time() + 3600,
        'path' => '/',
        'domain' => 'meusitebacana.com.br',
        'secure' => true,
        'httponly' => true,
        'samesite' => 'Strict', // Define SameSite como Strict
    ]);
    
  3. Valide as origens das solicitações (cabeçalhos Origin e Referer)

    Verifique se as solicitações têm a origem correta usando o cabeçalho "Origin" ou "Referer". Certifique-se de que as solicitações vêm do mesmo domínio que o seu site. No PHP, basta verificar as variáveis globais $_SERVER['HTTP_ORIGIN'] e $_SERVER['HTTP_REFERER'] antes de aceitar solicitações.

  4. Exija autenticação adicional

    Para ações sensíveis, como a alteração de senha ou a realização de transações financeiras, exija autenticação novamente antes de processar a solicitação. Isso pode ser feito solicitando a senha atual do usuário ou usando uma autenticação de dois fatores.

  5. Mantenha seu software atualizado

    Certifique-se de que todos os componentes de software utilizados em seu site, incluindo frameworks e bibliotecas, estejam atualizados para corrigir vulnerabilidades conhecidas, incluindo usando versões mais atualizadas do PHP, se o seu script suportar.

Este artigo foi útil para você?