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なメンバ変数の挙動

facebook slideshare rubygems github qiita