基本的にフレームワークはあまり利用しないのですが、必要に応じて選択することがあります。
今回は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を利用できます。
1 2 3 4 5 6 7 8 |
<?php echo $this->Form->create(); ・ ・=>いろいろなINPUT属性 ・ ・ echo $this->Form->end(); ? > |
こんな感じでテンプレートファイルに書き込むと↓みたいにformタグを生成してくれます。
1 2 3 4 5 6 |
<form id="RecipeAddForm" method="post" action="/controller名/アクション名"> ・ ・=>いろいろなINPUT属性 ・ ・ </form> |
ちなみにPOST先は表示ページのControllerとActionを自動で指定してくれますね。
validate(POST値のチェック)もDBへの保存もメソッドで一発です。
基本CakePHP使う人はこのFormHelperを利用しているかと思います。
ただ、全部やってくれる分、token一つだけ埋め込んで一致確認処理するのにわざわざModelに追加するのか・・・?とか思ってしまいました。(フレームワーク初心者)
解決法:コンポーネントの追加
CakePHPには共通のコントローラごとに共通の処理を支援する、コンポーネントという機能があります。
この中でtokenを埋め込み、CSRF対策をしてくれるコンポーネントが提供されています。
提供コンポーネントはバージョンによって異なります。
CakePHP 2.x:SecurityComponent
1 2 3 4 5 6 |
<?php class AppController extends Controller { public $components = array('Security'); } } |
CakePHP 3.x:CsrfComponent
1 2 3 4 5 6 |
<?php class AppController extends Controller { public $components = array('Csrf'); } } |
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