質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.54%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CSRF

クロスサイトリクエストフォージェリ (Cross site request forgeries、CSRF)は、 外部Webページから、HTTPリクエストによって、 Webサイトの機能の一部が実行されてしまうWWWにおける攻撃手法です。

Q&A

解決済

3回答

20676閲覧

CSRF対策をやったらChromeでだけエラーになる

redara

総合スコア344

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CSRF

クロスサイトリクエストフォージェリ (Cross site request forgeries、CSRF)は、 外部Webページから、HTTPリクエストによって、 Webサイトの機能の一部が実行されてしまうWWWにおける攻撃手法です。

1グッド

5クリップ

投稿2016/09/29 07:15

自前でPHPでやったCSRF対策

入力フォーム画面表示時に、

ランダムなトークンを発行してHTMLのhiddenに埋め込む。
同時に発行したトークンをセッションに保持する。

保存ボタンを押したときのアクションで

セッションのトークンとPOSTされたトークンを比較して、
一致していたらOK。不一致だったらエラーとする

上記の対策を入れたら
Chromeの場合だけエラーになってしまいます。
IEだとエラーにならない。

この事象が以前手元の自分の環境で再現したことがありましたが、再現しなくなったので
問題なさそうんだと判断し、リリースしたのですが、
一部のユーザー(全員でない)で事象が発生するようになってしまいました。
自分の環境では再現しないため、原因を追えません。

どういったことが考えられるでしょうか

zico_teratail👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

6

ベストアンサー

以前似たような現象であったのは、ブラウザの複数のウィンドウで同じフォームを開いた場合に、
セッション名が同じなので、セッション側は新しく開いたフォームの値になっており、
その後で、古い方のフォームをSubmitすると、トークンが合わずエラーになるというのがありました。

なお、サイト内に複数フォームがあって、そのセッション名が同じでも同じような現象がおこりますね。

あとは、自分なら原因切り分けのために、ログを出力してみますかね。
セッションのトークンとPOSTされたトークンが一致しなかったときだけ、ログを出力します。
それぞれのトークンもですが、セッションIDなどの情報もほしいですね。
そうすればサーバサイドに保存されているセッションとかも見れますし。

投稿2016/09/29 07:58

編集2016/09/29 07:59
popobot

総合スコア6586

nnssn, act823, zico_teratail, redara, yodel, y___👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popobot

2016/09/29 08:02

これChromeでのみ起きる問題ではないですが、そもそもChromeでしか起きないという前提も憶測だと思うので、参考までに
redara

2016/09/29 08:27

エラーになると画面的には入力画面に戻されるのですが、その際にも新規でトークンが発行されます。エラー直後に(再度新規のトークンが発行された状態で)POSTし直しても同様の現象であったので、複数ウィンドウが起因してるのは考えにくいです。(Chromeの場合HTMLソースを表示してもトークンが振り直されるので、ソースを表示した直後にPOSTするとエラーになるのは確認できています。)。またセッション名の衝突についても気を付けているつもりです。
redara

2016/09/29 08:30

本番環境でプログラムを戻してしまっていて、テスト環境では自分の環境でしか試せないのでエラー時のログが取れない状態です
redara

2016/09/29 08:40

質問の反応を見た限りメジャーな事象ではなさそうなので、何かしらの特殊な条件(一部ユーザーの特殊なブラウザの設定や特殊な操作方法)が原因な気がしてきました。何かしらフレームワーク標準のCSRF対策を利用するか、自前での別手段を考えたいと思ってきています。
popobot

2016/09/29 08:42

うまくいかないユーザは一度も成功していないということなんですかね!? あと、一時的にトークンが一致しないくてもエラーにならないようにして、 ログを取るという手はあると思います。
redara

2016/09/29 08:45

>一時的にトークンが一致しないくてもエラーにならないようにして、 >ログを取るという手はあると思います。 アドバイスありがとうございます。ログだけ取って様子を見てみます。
popobot

2016/09/29 09:07

ログに出すなら、User-Agentも一緒に出力するといいかもしれませんね
redara

2016/09/30 03:03

User-Agentを出力するようにしてわかったのですが、 Firefox起動した直後に入力画面のURLを直接叩いて入力画面を表示させたときに再現することがわかりました。 ただ1回失敗して2回目のPOSTではエラーにならなくなるので、前に出ていた繰り返しエラーになる挙動とは多少異なります。
redara

2016/09/30 03:08

ChromeっぽいUser-Agentでもログを吐いているようですが、こちらの原因は特定できていません
popobot

2016/09/30 03:12

Firefox起動直後に開発ツールを起動してネットワーク欄を表示させたあと、URLを直接叩くと理由がわかるかもですね。 ただユーザがやっている操作とは思えないので、別の事象かもですね ちなみに、フォームとセッションのトークンどちらもそれっぽいんですか?
popobot

2016/09/30 03:14

あとは、アクセスログからそのユーザエージェントのユーザがどういった操作をしていたかをトレースすると原因に近づくかもしれませんね。
redara

2016/09/30 06:04

Firefoxで再現しながら挙動を見てみたのですが、どうもfavicon.icoへのリクエストが入力画面へリダイレクトしてセッションを書き変えてるっぽいので、リクエストを抑止するかfavicon.icoを正しく設置するかして対応してみたいと思います。調査方法等の指南ありがとうございました。大変たすかりました
popobot

2016/09/30 07:02

あー、favicon.icoでしたか。とりあえず、原因がわかってよかったです!
guest

0

一部ユーザだけ起きるのであれば、
エクステンションか先読み機能か何かが
裏で入力画面を再読込してる
→サーバ側セッションのトークンは更新される、
→ブラウザ側トークンはそのまま
→不一致でエラー

あたりではないかと妄想。

投稿2016/09/29 15:59

rana_kualu

総合スコア92

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

redara

2016/09/30 03:04

ブラウザのエクステンションや先読み機能などの可能性は高いかもしれません。 どのような機能で発生するのか特定しにくいのがつらいところですが。
guest

0

その「一部のユーザー」のブラウザがクッキーを受け入れない設定になっているとか?

投稿2016/09/29 07:43

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

redara

2016/09/29 07:47

自分の環境でも以前は再現したことがありましたが、そういった設定は行っておりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.54%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

同じタグがついた質問を見る

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CSRF

クロスサイトリクエストフォージェリ (Cross site request forgeries、CSRF)は、 外部Webページから、HTTPリクエストによって、 Webサイトの機能の一部が実行されてしまうWWWにおける攻撃手法です。