phpで、フォームを使ったプログラムを開発しています。
連打防止の仕組みとして、
「フォーム表示(ワンタイムトークンセッション発行)」→「投稿完了」
と、2ステップのうち1ステップ目に、ワンタイムトークンを発行しています。
しかし、原因不明の現象が発生し、困っています。
フォーム表示時に発行するセッションが「12345」の場合、フォーム上にもhiddenで「12345」が入ります。
そして「投稿ボタン」を押して投稿処理に進むと、「セッションの値」と「フォームから届いたhiddenの値」が異なり、投稿できない現象が時折発生します。
ほとんどの場合は問題が無いのですが、一部のユーザーから投稿できないと連絡があり調べていますが、原因がわかりません。
主に「アンドロイドスマホ」からの投稿で発生しているかも、という程度しかわかりません。
確認のため、エラーログを出力しても、確かにセッションとhiddenから受け取った値は異なっていました。
何が原因かわからなくてハマってしまっているので、何か情報頂けると助かります。
コメント(2件)
どっちが想定とズレているか確認するのが第一歩だと思います。
(投稿画面のアドレスが同じなのでブラウザ側がキャッシュを表示したせいでhiddenが前回の値になっている、など)
例えば投稿完了画面から「戻る」を押して再投稿したらどうなるとか
どうやら、フォーム側の値が変わっているようです。
何度もフォームにアクセスがあり、エラーになるときは、「過去に発行したセッションID」をフォームから送信しているようでした。
何度もフォームにアクセスしていて、その間に発行されたセッションの「どれか」がフォームから送信されているので、単純なキャッシュではない感じもします。(直前のセッションIDじゃなくて、もっと前のセッションIDが使われたりしているため)
スマホ用のウイルス対策ソフトの影響なのかなあと感じてますが、よくわかりません。