ここから本文です

PHPでのCSRF対策をしたいと思い調べているのですが、ワンタイムトークンを使えばい...

アバター

ID非公開さん

2015/10/1802:17:58

PHPでのCSRF対策をしたいと思い調べているのですが、ワンタイムトークンを使えばいい。ワンタイムトークンは止めたほうがいい。

そもそもトークンは...など色々な情報があり結局どうすればいいのか分からない状態にあります。

・CSRFはPOSTやGETのリクエストを勝手に送って実行させる攻撃
・投稿ページ等のページにアクセスした時に乱数を作成してセッションに入れ、hiddenにも埋め込み、投稿ページの欲しい情報と一緒に受け取って、実行する時に乱数の入れたセッションと送られて来たhiddenの値を比べて一致していたら実効する

以上のように理解しているのですが正しいのでしょうか?
またどのように実装するのがいいのでしょうか?

この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。

閲覧数:
2,360
回答数:
1
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

ryosuke_i_628さん

リクエストマッチ

2015/10/1813:52:01

> 以上のように理解しているのですが正しいのでしょうか?

その通りです。

> 色々な情報があり結局どうすればいいのか分からない状態にあります。

徳丸さんのブログに「CSRF対策のトークンをワンタイムにしたら意図に反して脆弱になった実装例」がありましたね。(正直これは極端すぎる例だと思うんですが)まとめは分かりやすく書かれていました。引用します。

「トークン生成は安全な乱数を用いるべきであり、安全な疑似乱数生成器がない場合は、セッションIDそのものを使う方法が妥当」

ただし、セッションID自体が別の脆弱性により流出してしまう可能性も考慮すべきであるとも言われています。それらを考慮すると、以下のどちらかの実装が良さそうです。ワンタイム性自体はCSRFという括りにおいてはセキュリティにそれほど関係ないので、必要に応じて希望のものを採用してください。

・運用上多重送信などが成功しにくいようにワンタイム性を持たせたい場合は openssl_random_psuedo_bytes を利用して乱数を作る。

・ワンタイム性が不必要な場合はソルトを混ぜた上でsha1ハッシュを生成して利用する。あるいは更に高度な暗号化が可能になる password_hash を利用する。但しこれはもっぱらパスワードの保護に使われるもので、CSRFトークンの保護にCPUコストを割く必要があるかどうかは微妙なところ。ソルト入りsha1ハッシュだけでもソルトがバレなければ十分な強度はある。

前者の実装例はこちらにあります↓ (A)
http://qiita.com/mpyw/items/8f8989f8575159ce95fc

後者は、sha1を使う場合は (B)

$salt = 'くぁwせdrftgyふじこlp';
$token = sha1($salt . session_id());

password_hashを使う場合は (C)

$token = password_hash(session_id(), PASSWORD_BCRYPT);

でいいと思います。(C)は正直あんまりおすすめしません。(A)か(B)、ケースバイケースで、って感じです。

アバター

質問した人からのコメント

2015/10/18 15:49:39

理解できていたということで良かったです。
他にも解説してもらいスッキリしました。
ありがとうございました!

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。