Pergunta

Qual é a melhor maneira de parar uma forma de ser reprocessado quando um usuário aperta um botão Voltar?

Eu estou seguindo o Post / Redirect / Get padrão , então Eu não tenho um problema se F5 é empurrado, mas o botão de volta ainda oferece a oportunidade de voltar a apresentar o formulário. Se essa forma é uma página de processamento de cartão de crédito, isso é ruim.

Esta pergunta tem sido feita um pouco aqui , mas o fraseado e respostas eram de má qualidade e não específica a este problema exatamente.

Eu tenho form.php que submete a si mesmo. Se não houvesse erros nos dados de entrada, mediante a apresentação, o usuário é redirecionado para form_thanks.php. Bater para trás (e "Enviar" ou "Resubmit") uma vez reenvia form.php (BAD!) E, em seguida, leva-los de volta para form_thanks.php.

Por favor também incluem soluções que não envolvem o uso de Sessões, se possível.

Foi útil?

Solução 2

Isto deve ser feito com um token de uso único, ou um nonce . O php / servidor deve incluir este token em um campo de formulário oculto.

Deve armazenar uma lista de todas as fichas recentes e cada vez que um formulário é enviado, ele deve verificar para ver se o token está na lista dos últimos tokens válidos.

Se não for na lista, então não reprocessar o formulário.
Se for na lista, em seguida, processar o formulário e remover o token da lista.

Os tokens podem ser tratadas dentro de sessões ou apenas uma tabela de banco de dados simples, sem sessões. As fichas devem ser específicas do utilizador embora.

Esta é também a maneira recomendada para evitar CSRF ataques.

Outras dicas

Eu faria isso de forma diferente. Coloque uma entrada escondida com uma seqüência aleatória como o valor, e quando da loja alegou que seqüência aleatória em uma sessão. Configurar uma verificação simples para ver se eles já postou e se eles têm não aceitam a entrada.

Só de pensar em voz alta aqui. Mas o que dizer de uma variação do post / redirecionamento / get onde a get final não é realmente o get final;), mas em vez disso, por sua vez, sempre encaminha automaticamente para a página de verdadeiramente final, de modo que o usuário deve apertar o botão de volta, eles retornam de volta à direita onde eles vieram?

EDIT:

Ok, levando em consideração o comentário do OP, aqui está uma outra idéia. O URL para o envio do formulário pode ser feita para exigir um parâmetro que é bom para apenas um uso. Esse token seriam gerados (usando MD5 ou algo assim) antes que o formulário foi submetido e pode ser armazenado em um banco de dados (em resposta à sugestão de alguém que pediu uma solução sem o uso de sessões). Após o formulário é processado, este símbolo, então, ser apanhado na base de dados como tendo sido já utilizado. De modo que quando a página é retornada para com a mesma forma, podem ser tomadas medidas para evitar que a nova apresentação dos dados do formulário para o servidor.

resposta tardia, mas pode-se evitar o processamento por completo, utilizando uma solução à base de AJAX; não haveria um problema com incluindo um nonce com este esquema de processamento, mas usando uma consulta assíncrona que, em caso de sucesso, redireciona o usuário, as solicitações não sejam repetidos por refrescante, pressionando para trás, ou qualquer outra coisa do que clicar no botão.

Também é fácil de implementar um mecanismo que impede o botão a partir de qualquer ser pressionado duas vezes ou ser "trancado" se alguma coisa aconteceu durante a solicitação ao incorporar na rotina de tratamento para o pedido (seja de alto nível com PrototypeJS ou jQuery ou baixa nível com a sua função handrolled) os mecanismos para ativar e desativar o botão quando da conclusão do pedido e os primeiros fogos, respectivamente.

Eu acho que voltar vai trazer o formulário para o estado em que estava antes da página foi redirecionado, se for esse o caso, tem uma entrada / variável ou algo escondido que começa com o valor de dizer verdade, então uma vez que o formulário é enviado, e se o valor for true, alterá-lo para falso e, em seguida, apresentar, falsa retorno outra

Tente isto:

<SCRIPT type="text/javascript">
    window.history.forward();
</SCRIPT>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top