• 締切済み

PHPのCSRF対策について

PHPのCSRF対策について教えてほしいです。 ネットで調べたのですが、いろんな意見がありどれが正しいのかわからず困っています。 現在手元にある参考書には、CSRF対策としてトークンをhiddenフォームに埋め込み、データ送信時にサーバーが割り当てたトークンを持っているかどうかを確かめる方法があると紹介されているのですがこれでも十分なのでしょうか? ~コード~ sha1(session_id()); hash("sha256",session_id());

みんなの回答

noname#244856
noname#244856
回答No.1

固定トークンとワンタイムトークンで迷われている感じですかね? ブラウザの多重送信による誤作動を防ぎたいなど、別の目的が無ければワンタイムにする必要は全くありません。尤も、その目的があったとしてもCSRFチェックと同時にやる必要はないかもしれません…(以前は http://qiita.com/mpyw/items/8f8989f8575159ce95fc に書いているとおりワンタイム派だったのですが、最近専ら固定派ですね…) ただしセッションIDそのものを埋め込むのはやや不用心な気はするので(万が一のXSSに備えてCookieをhttponlyにしていてもその意味がなくなってしまうので)ハッシュ値を取るのが妥当だと思います。 >> sha1(session_id()); 僕はこれ使ってますね。 セッションIDごときでここまで万全にする必要は無いかもしれませんが、 sha1(session_id() . "foobarbaz") のように何かしらソルトを混ぜることもあります。 >> hash("sha256", session_id()); 念には念を、というのであればSHA256はよい選択肢です。いっその事512でもいいかもしれません。 -------- 今回の話題とはほぼ無関係で、且つ非常に限られた場合にしか成立しませんが、ソルトをつけるにあたってもし前方に付けてしまうと、以下のような攻撃に対して脆弱になってしまうことがあります。どちらかと言えば後方のほうが無難でしょう。尤も、前方につけるにしても付けないよりは付けたほうが遥かにマシです。 Length Extension Attack: https://wiki.mma.club.uec.ac.jp/CTF/Toolkit/HashPump