質問: 自前でPHPでやったCSRF対策 > > 入力フォーム画面表示時に、 > > ランダムなトークンを発行してHTMLのhiddenに埋め込む。 > > 同時に発行したトークンをセッションに保持する。 > > > 保存ボタンを押したときのアクションで > > セッションのトークンとPOSTされたトークンを比較して、 > > 一致していたらOK。不一致だったらエラーとする > > > 上記の対策を入れたら Chromeの場合だけエラーになってしまいます。 IEだとエラーにならない。 この事象が以前手元の自分の環境で再現したことがありましたが、再現しなくなったので 問題なさそうんだと判断し、リリースしたのですが、 一部のユーザー(全員でない)で事象が発生するようになってしまいました。 自分の環境では再現しないため、原因を追えません。 どういったことが考えられるでしょうか
回答: 以前似たような現象であったのは、ブラウザの複数のウィンドウで同じフォームを開いた場合に、 セッション名が同じなので、セッション側は新しく開いたフォームの値になっており、 その後で、古い方のフォームをSubmitすると、トークンが合わずエラーになるというのがありました。 なお、サイト内に複数フォームがあって、そのセッション名が同じでも同じような現象がおこりますね。 あとは、自分なら原因切り分けのために、ログを出力してみますかね。 セッションのトークンとPOSTされたトークンが一致しなかったときだけ、ログを出力します。 それぞれのトークンもですが、セッションIDなどの情報もほしいですね。 そうすればサーバサイドに保存されているセッションとかも見れますし。