sfFormのCSRF機能制御
symfony1.4のsfForm
- symfony1.4のsfFormには、CSRF対策のためのトークンを入れる機能が初めから備わっており、推測されにくいトークンがhidden項目としてセットされるようになっています
- ただ、場合によってはこの機能をオフにしたいこともありますので、その方法をメモ。
このフォームのみCSRF対策機能を無効にするソース
class MyForm extends BaseForm
{
public function configure()
{
$this->disableLocalCSRFProtection(); // このフォームのみCSRF対策機能を無効にする
...
すべてのフォームについてCSRF対策機能を無効にするソース
class MyForm extends BaseForm
{
public function configure()
{
$this->disableCSRFProtection(); // すべてのフォームについてCSRF対策機能を無効にする
...
余談
- sfForm::disableCSRFProtection()のみを使用していたのですが、1アクションで複数フォームを使用するシチュエーションでハマりました。
- フォームAではCSRF対策有効、フォームBでは対策を無効にしたく、フォームBでdisableCSRFProtection()したところ、フォームAのバリデートで「CSRF attack detected.」というエラーが発生しました。
- きちんと動作を把握していなかったのが悪いのですが、実際の動作としてはランダム文字列なtoken文字列が変わってしまうだけなので、罠に落ちたことが分かりにくいと感じました。
- 具体的には、sfForm::disableCSRFProtection()でtoken生成時に使用する sfForm::$CSRFSecret というスタティックメンバ変数にfalseをセットしているのですが、この挙動自体もよくわかっておらず、長いsymfonyコード探索の旅に出ることになってしまいました。→スーパークラスのstaticなメンバ変数の挙動