CakePHPでCSRF対策

基本的にフレームワークはあまり利用しないのですが、必要に応じて選択することがあります。

今回はCakePHPで実装をした際にCSRF(クロスサイトリクエストフォージェリ)の脆弱性対策をどのように行ったのかを備忘録的に書き留めました。

CSRF

そもそもCSRFとは(クロスサイトリクエストフォージェリ)な方は以下を↓

http://www.trendmicro.co.jp/jp/security-intelligence/threat-solution/csrf/index.html

ざっとかいつまむと、ユーザの意図しないタイミングでリクエストを受け付けてしまう脆弱性です。

悪意ある第三者がPOST値を改ざんしてユーザを誘導することで発生し得ます。

基本方針

リクエスト送信フォーム内にhidden値でワンタイムtokenを埋め込み、同一セッション内での一致確認を行います。

すると、悪意ある第三者にはワンタイムtokenの生成方法もわからないため、改ざんが難しくなるという話です。

CakePHPのフォーム機能

CakePHPでform機能を実装する場合、FormHelperを利用できます。

こんな感じでテンプレートファイルに書き込むと↓みたいにformタグを生成してくれます。

ちなみにPOST先は表示ページのControllerとActionを自動で指定してくれますね。

validate(POST値のチェック)もDBへの保存もメソッドで一発です。

基本CakePHP使う人はこのFormHelperを利用しているかと思います。

ただ、全部やってくれる分、token一つだけ埋め込んで一致確認処理するのにわざわざModelに追加するのか・・・?とか思ってしまいました。(フレームワーク初心者)

解決法:コンポーネントの追加

CakePHPには共通のコントローラごとに共通の処理を支援する、コンポーネントという機能があります。

この中でtokenを埋め込み、CSRF対策をしてくれるコンポーネントが提供されています。

提供コンポーネントはバージョンによって異なります。

CakePHP 2.x:SecurityComponent

CakePHP 3.x:CsrfComponent

2.xではbeforeFilterで設定する方法、3.xではinitializeで設定する方法もあります。

他のコンポーネントも利用したい場合は配列に追加指定すれば複数利用できます。

 

細かいことはCookBookに書いてくれているので参考にどうぞ。

SecurityComponent

https://book.cakephp.org/2.0/ja/core-libraries/components/security-component.html

CsrfComponent

https://book.cakephp.org/3.0/ja/controllers/components/csrf.html

●この記事を書いた人