Previnição de Reenvio de Formulário ao Atualizar a Página
Resposta Rápida
Para evitar o reenvio de dados de formulário ao atualizar a página, deve-se utilizar a abordagem Post/Redirect/Get (PRG). Esta metodologia envolve executar um redirecionamento 302 após processar uma solicitação POST, que direciona o usuário para uma página de confirmação ou de volta ao formulário original.
Exemplo de Implementação em PHP:
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Processar dados do formulário e assegurar segurança
header('Location: confirmacao.php'); // Sair da "zona de perigo"
exit;
}
Esse método garante que o processo reinicie com uma solicitação GET para confirmacao.php
, evitando o reenvio de dados.
Protegendo os Dados do Usuário
É crucial garantir que os dados do usuário não sejam perdidos durante o redirecionamento. Os dados podem ser armazenados em sessões ou cookies, permitindo que as informações do usuário sejam recuperadas após o redirecionamento e garantindo uma experiência consistente:
session_start(); // Iniciar a sessão
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Salvar dados do formulário na sessão
$_SESSION['dados_do_formulario'] = $_POST;
// Redirecionar o usuário
header('Location: ' . $_SERVER['PHP_SELF']);
exit;
} elseif (!empty($_SESSION['dados_do_formulario'])) {
// Restaurar dados
$dados_do_formulario = $_SESSION['dados_do_formulario'];
// Limpar a sessão
unset($_SESSION['dados_do_formulario']);
}
Para armazenar dados no lado do cliente sem interação com o servidor, você pode usar localStorage
ou sessionStorage
em JavaScript.
Utilizando Identificadores Únicos e Garantindo Idempotência no Servidor
Atribuir um identificador único para cada solicitação de envio de formulário permite que ela seja vinculada a um token único gerado com base em dados de sessão ou no banco de dados. Após o uso do token, ele se torna inválido, evitando que seja reutilizado:
session_start(); // Iniciar a sessão
$id_unico = bin2hex(random_bytes(16)); // Gerar ID único
$_SESSION['form_id_unico'] = $id_unico; // Armazená-lo na sessão
Ao processar dados do formulário:
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if ($_POST['form_id_unico'] === $_SESSION['form_id_unico']) { // Verificar o token
// Processar dados do formulário
// Invalidar o token após o uso
unset($_SESSION['form_id_unico']);
header('Location: confirmacao.php');
exit;
}
}
Fortalecendo a Proteção do Lado do Cliente
Além da lógica PRG no servidor, a proteção do lado do cliente pode ser implementada usando JavaScript. O método window.history.replaceState
permite gerenciar o histórico do navegador:
if (window.history.replaceState) {
window.history.replaceState(null, null, window.location.href); // Remover o formulário do histórico do navegador
}
Essa abordagem remove as informações do formulário do histórico e evita o reenvio ao atualizar a página.
Visualização
Imagine enviar um formulário como lançar um avião de papel com uma mensagem:
Antes: [✉️🏗️] -> [🛫]
Se o mecanismo de segurança não estiver implementado:
Depois: [✉️🏗️] -> [🛫🛫🛫]
Com o mecanismo de segurança em funcionamento:
Depois: [✉️🏗️] -> [🛫] -> [📭] - e seu avião de papel voará em uma única direção!
Práticas de Segurança
Proteja os dados do usuário e proteja os formulários contra ataques de "Cross-Site Request Forgery" (CSRF). Utilize tokens e algoritmos de hash para criar tokens seguros. A validação durante o processamento do formulário contribui para uma maior segurança.
Melhorando a Experiência do Usuário
Quaisquer tecnologias implementadas no processo devem permanecer discretas para o usuário e não causar desconforto. Para reduzir a carga do servidor e eliminar a possibilidade de reenvio, realize a validação do lado do cliente antes de enviar os dados para o servidor.
Verifique Tudo Antes de Fazer uma Pausa
Revise e teste regularmente o procedimento de processamento do formulário. Assegure-se de que a validação do lado do servidor e a validação do lado do cliente efetivamente previnam o reenvio de dados do formulário.
Recursos Úteis
- Redirecionamentos em HTTP - HTTP | MDN — um guia detalhado da MDN explicando como funcionam os redirecionamentos HTTP.
- PHP: $_SESSION - Tutorial — aprenda sobre como gerenciar sessões em PHP e trabalhar com estados do servidor.
- Cookies em JavaScript — útil para quem deseja entender melhor a gestão de cookies em JavaScript.
- Post/Redirect/Get - Wikipedia — uma visão mais detalhada sobre o padrão PRG.
- Guia de Formulários HTML | web.dev — um recurso abrangente cobrindo formulários HTML.
- Cross-Site Request Forgery (CSRF) | OWASP Foundation — explore técnicas para combater CSRF propostas pela OWASP para proteger seus formulários.