SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
05.04.2025

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

  1. Redirecionamentos em HTTP - HTTP | MDN — um guia detalhado da MDN explicando como funcionam os redirecionamentos HTTP.
  2. PHP: $_SESSION - Tutorial — aprenda sobre como gerenciar sessões em PHP e trabalhar com estados do servidor.
  3. Cookies em JavaScript — útil para quem deseja entender melhor a gestão de cookies em JavaScript.
  4. Post/Redirect/Get - Wikipedia — uma visão mais detalhada sobre o padrão PRG.
  5. Guia de Formulários HTML | web.dev — um recurso abrangente cobrindo formulários HTML.
  6. Cross-Site Request Forgery (CSRF) | OWASP Foundation — explore técnicas para combater CSRF propostas pela OWASP para proteger seus formulários.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!