PHP:[戻る]が押されたときにフォームが誤って再処理されないようにする

StackOverflow https://stackoverflow.com/questions/1646812

質問

ユーザーが[戻る]ボタンを押したときにフォームの再処理を停止する最良の方法は何ですか?

Post / Redirect / Getパターンに従っているので、 F5キーを押しても問題はありませんが、戻るボタンを使用するとフォームを再送信できます。このフォームがクレジットカード処理ページの場合、これは不適切です。

この質問はやや尋ねられましたこちらが、フレージングと回答は質が悪く、この問題に正確に特有のものではありませんでした。

自分自身に送信するform.phpがあります。送信時に入力データにエラーがなかった場合、ユーザーはform_thanks.phpにリダイレクトされます。もう一度ヒット(および「送信」または「再送信」)すると、form.php(BAD!)が再送信され、form_thanks.phpに戻されます。

可能であれば、セッションの使用を伴わないソリューションも含めてください。

役に立ちましたか?

解決 2

これは、使い捨てトークン、または nonce を使用して行う必要があります。 php / serverは、このトークンを非表示フォームフィールドに含める必要があります。

最近のすべてのトークンのリストを保存し、フォームが送信されるたびに、トークンが最近の有効なトークンのリストにあるかどうかを確認する必要があります。

リストにない場合は、フォームを再処理しないでください。
リストにある場合は、フォームを処理し、リストからトークンを削除します。

トークンはセッション内で処理することも、セッションなしの単純なデータベーステーブルで処理することもできます。ただし、トークンはユーザー固有である必要があります。

これは、 CSRF 攻撃を回避するための推奨される方法でもあります。

他のヒント

別の方法でやります。値としてランダムな文字列を使用して非表示の入力を行い、送信時にそのランダムな文字列をセッションに保存します。簡単なチェックを設定して、既に投稿しているかどうか、入力を受け入れていないかどうかを確認します。

ここで大声で考えてください。しかし、最終的な取得が実際には最終的な取得ではない場合のポスト/リダイレクト/取得のバリエーションはどうですか?彼らはどこから来たのですか?

編集:

Ok、OPのコメントを考慮に入れて、ここに別のアイデアがあります。フォーム送信のURLは、1回の使用にのみ有効なパラメーターを要求するように作成できます。そのトークンは、フォームが送信される前に(MD5などを使用して)生成され、データベースに保存できます(セッションを使用せずにソリューションを要求した他の誰かの提案に応じて)。フォームが処理された後、このトークンはデータベースで既に使用されているとしてフラグが立てられます。同じトークンでページが返されたときに、バックエンドへのフォームデータの再送信を防ぐための手順を実行できます。

遅い答えですが、AJAXベースのソリューションを使用することで、処理を完全に回避できます。この処理スキームにノンスを含めることには問題はありませんが、成功するとユーザーをリダイレクトする非同期クエリを使用することで、更新、ボタンを押す、またはボタンをクリックする以外の何かによってリクエストが繰り返されません。

ボタンが2回押されたり、「ロック」されたりするのを防ぐメカニズムを実装することも簡単です。リクエストのハンドラーに埋め込むことでリクエスト中に何かが発生した場合(PrototypeJSまたはjQueryの高レベルまたはハンドロール関数の低レベル)、リクエストが完了して最初に起動したときにボタンをそれぞれ有効または無効にするメカニズム

戻ると、フォームがページがリダイレクトされる前の状態に戻り、その場合、非表示の入力/変数、または値で始まる何かがtrueである場合、フォームが送信されると、値がtrueの場合、falseに変更して送信し、そうでない場合はfalseを返します

これを試してください:

<SCRIPT type="text/javascript">
    window.history.forward();
</SCRIPT>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top