Introdução
CSRF (Cross-Site Request Forgery) é um ataque que explora a confiança de um usuário autenticado, forçando-o a executar ações indesejadas sem seu consentimento. Esse ataque ocorre quando uma aplicação web não verifica corretamente a origem das requisições.
1. Como funciona um ataque CSRF?
Um atacante pode criar um link ou formulário malicioso que, quando acessado por um usuário autenticado, executa ações indesejadas, como alteração de senha ou transferências bancárias. O perigo do CSRF é que ele explora a sessão já existente do usuário sem a necessidade de roubo de credenciais.
2. Implementando proteção contra CSRF com tokens de sessão
A forma mais eficaz de mitigar ataques CSRF no PHP é utilizar tokens de sessão que validam a origem das requisições.
Gerando um token CSRF
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
Isso garante que cada usuário tenha um token único para proteção de requisições.
Incluindo o token CSRF nos formulários
Nos formulários HTML, adicionamos um campo oculto contendo o token CSRF:
<form method="POST" action="processa.php">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<button type="submit">Enviar</button>
</form>
Validando o token no servidor
No processamento da requisição, verificamos se o token é válido antes de executar qualquer ação:
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("Ação não permitida: token CSRF inválido.");
}
Isso impede que requisições não autorizadas sejam processadas.
3. Aplicando SameSite nos cookies de sessão
Configurar os cookies para SameSite=Strict
impede que sessões sejam reutilizadas em contextos externos:
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
session_start();
Isso reduz significativamente a possibilidade de exploração CSRF.
4. Restringindo métodos HTTP em ações críticas
Apenas requisições POST
devem ser permitidas para ações sensíveis, evitando que dados sejam enviados via GET
:
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
die("Método não permitido");
}
Isso impede ataques CSRF via links maliciosos que tentam explorar GET
.
5. Monitorando atividades suspeitas
Registrar tentativas de CSRF ajuda a identificar padrões de ataque:
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
file_put_contents("logs/csrf.log", date('Y-m-d H:i:s') . " - Tentativa de ataque CSRF detectada\n", FILE_APPEND);
die("Ação não permitida");
}
Isso permite rastrear possíveis tentativas de exploração na aplicação.
Conclusão
Mitigar ataques CSRF no PHP é essencial para proteger ações sensíveis da aplicação. O uso de tokens CSRF, configuração de cookies SameSite
e restrição de métodos HTTP são medidas fundamentais para impedir requisições fraudulentas e garantir a segurança dos usuários.
Por que proteger sua aplicação PHP contra CSRF é essencial?
Ataques CSRF exploram a confiança do navegador do usuário na sessão autenticada. Muitas aplicações PHP vulneráveis permitem que ações críticas sejam executadas sem validação de origem, tornando-se alvos fáceis para atacantes.
A solução mais eficaz é implementar tokens CSRF, garantindo que cada requisição legítima inclua um identificador exclusivo vinculado à sessão do usuário. Além disso, a configuração correta de cookies e a restrição de métodos HTTP podem reduzir significativamente as chances de exploração.
Ao adotar essas medidas, protegemos usuários contra ações fraudulentas e fortalecemos a segurança geral da aplicação, impedindo que terceiros manipulem dados sensíveis sem autorização.
Algumas aplicações:
- Prevenção contra requisições maliciosas que manipulam dados do usuário.
- Proteção de formulários sensíveis, como login e alteração de senha.
- Redução de riscos de ataques automatizados contra APIs e sistemas web.
- Garantia de que ações sensíveis sejam executadas apenas por usuários autenticados.
Dicas para quem está começando
- Sempre gere tokens CSRF exclusivos para cada sessão de usuário.
- Inclua tokens CSRF em formulários e valide-os no servidor antes de processar requisições.
- Configure cookies de sessão com
SameSite=Strict
para evitar reutilização externa. - Restrinja ações sensíveis para requisições
POST
em vez deGET
. - Monitore logs para detectar tentativas de ataques CSRF e reforçar a segurança da aplicação.
Contribuições de Renata Oliveira