フォーム画面で入力を行うときにはPOSTでデータを受け取ってエラーチェックしたり、データベースに入力をしたりします。
ただその時に何も考えずに安易に送信→受信の際に以下のようなトラブルがあり得ます。
- 二重投稿(ボタンを二回押してしまう)
- 完了画面でリロードしてしまう
- 入力→完了画面に遷移した後で、ブラウザの「戻る」ボタンで入力画面に戻ったのちに送りなおす。
このような処理を防ぐ目的で「トランザクショントークン」という手法が使われます。
以下がトランザクショントークンの大まかな流れです。
- まず画面読み込み時に不規則な文字列を生成する(これをトークンといいます。)
- トークンをセッションに登録、同時にHTMLにもhiddenで持たせる
- ユーザーが投稿したときにはPOSTでトークンが送られる
- リクエストがPOSTの時は送られたトークンがセッションの中に入っているトークンと合致するかをチェックする。(合致した場合は正常な遷移)
- セッションのなかのトークンを削除し、1に戻る
この方法であれば正常な遷移の場合は、セッションのトークンとPOSTのトークンが合致しますが、不正な画面遷移では合致しないか、セッションのトークンがない、という状態になります。
上記のような実装を行うことで安全なフォームの遷移を実装することができます。
参考リンク
ECCUBEのソース
[…] トランザクショントークン […]