Proteção de Formulários contra CSRF

Neste artigo
  1. Como Funciona o Ataque CSRF
  2. Técnicas de Proteção contra CSRF
  3. Exemplo prático

Proteção de Formulários contra CSRF é um conjunto de técnicas e mecanismos de segurança implementados em aplicações web para impedir que um atacante execute ações não autorizadas em nome de um usuário legítimo através de um formulário. CSRF é a sigla para Cross-Site Request Forgery, que em português significa “Falsificação de Solicitação Entre Sites”. Trata-se de uma vulnerabilidade comum que afeta sites e aplicações web, permitindo que um invasor force um usuário autenticado a realizar ações indesejadas, como alterar dados pessoais, fazer transações financeiras ou deletar conteúdo, sem que o usuário tenha consciência disso.

A importância da proteção contra CSRF cresceu significativamente com o aumento de ataques sofisticados na internet. Quando um usuário está logado em um site, seu navegador mantém uma sessão ativa. Se esse usuário visitar um site malicioso enquanto ainda está autenticado no primeiro site, o atacante pode tentar fazer requisições automáticas para o site legítimo usando a sessão ativa do usuário. Sem proteção adequada, essas requisições seriam aceitas como se fossem legítimas, causando danos potenciais. Por isso, implementar proteção contra CSRF é uma prática essencial de segurança que todo desenvolvedor e proprietário de site deve conhecer e aplicar.

Como Funciona o Ataque CSRF

Um ataque CSRF ocorre quando um usuário autenticado em um site é enganado para acessar um site malicioso. Esse site malicioso contém código que tenta fazer uma requisição para o site legítimo onde o usuário está logado. Por exemplo, imagine que você está logado em sua conta bancária. Enquanto mantém essa aba aberta, você clica em um link para um site suspeito. Esse site pode conter um formulário oculto que, quando a página carrega, automaticamente envia uma requisição para transferir dinheiro da sua conta bancária para a conta do atacante. Como você está autenticado no banco, a requisição é aceita e a transferência acontece sem que você tenha feito nada manualmente.

O atacante não precisa saber sua senha ou ter acesso direto à sua conta. Ele apenas aproveita o fato de que você já está autenticado. O navegador envia automaticamente seus cookies de sessão com qualquer requisição feita para o site bancário, então o banco acredita que a requisição é legítima. Esse é o motivo pelo qual a proteção contra CSRF é tão importante: ela verifica se a requisição realmente veio de um formulário legítimo do site, e não de um site externo malicioso.

Técnicas de Proteção contra CSRF

A técnica mais comum e eficaz para proteger formulários contra CSRF é o uso de tokens CSRF. Um token CSRF é uma sequência aleatória e única de caracteres que é gerada pelo servidor e inserida em cada formulário. Quando o usuário submete o formulário, o token é enviado junto com os dados. O servidor então valida se o token é válido e se corresponde ao token armazenado na sessão do usuário. Se o token não for válido ou estiver ausente, o servidor rejeita a requisição. Como o atacante não tem acesso ao token gerado especificamente para aquele usuário em aquela sessão, ele não consegue criar um formulário malicioso com o token correto.

Além dos tokens CSRF, existem outras medidas complementares de proteção. O uso de atributos SameSite em cookies é uma técnica moderna que restringe quando os cookies de sessão são enviados com requisições cross-site. Também é recomendado validar o header “Referer” ou “Origin” para confirmar que a requisição veio do próprio site. Implementar CORS (Cross-Origin Resource Sharing) corretamente também ajuda a prevenir requisições não autorizadas de domínios externos. Frameworks modernos de desenvolvimento web geralmente já incluem proteção contra CSRF por padrão, facilitando a implementação dessas medidas sem que o desenvolvedor precise fazer tudo do zero.

Outra prática importante é usar o método HTTP POST para operações que modificam dados, em vez de GET. Requisições GET devem ser usadas apenas para recuperar informações, nunca para alterar dados. Isso porque requisições GET podem ser facilmente disparadas por imagens ou links, enquanto requisições POST requerem mais ação do navegador. Além disso, manter cookies de sessão com tempo de expiração apropriado reduz a janela de oportunidade para um ataque CSRF, pois a sessão do usuário não permanecerá ativa indefinidamente.

Exemplo prático

Considere um site de gerenciamento de conteúdo que permite aos usuários alterar sua senha através de um formulário. Sem proteção contra CSRF, um desenvolvedor criaria um formulário simples que envia os dados da nova senha para o servidor. No entanto, um atacante poderia criar um site malicioso com um formulário oculto que envia uma requisição para alterar a senha do usuário. Se esse usuário visitasse o site malicioso enquanto estivesse logado no gerenciador de conteúdo, a senha seria alterada automaticamente sem sua autorização.

Com proteção contra CSRF implementada, o formulário legítimo de mudança de senha inclui um token único gerado pelo servidor. Quando o usuário submete o formulário, esse token é validado. O formulário malicioso do site atacante não possui esse token válido, portanto quando o atacante tenta enviar uma requisição com um token inválido ou inexistente, o servidor rejeita a operação. Dessa forma, apenas requisições que originam de formulários legítimos do site são processadas, protegendo a conta do usuário contra alterações não autorizadas.