(ページの作成:「== sfFormのCSRF機能制御 == === symfony1.4のsfForm === *symfony1.4のsfFormには、CSRF対策のためのトークンを入れる機能が初めから備わって...」)
 
 
33行目: 33行目:
 
*きちんと動作を把握していなかったのが悪いのですが、実際の動作としてはランダム文字列なtoken文字列が変わってしまうだけなので、罠に落ちたことが分かりにくいと感じました。
 
*きちんと動作を把握していなかったのが悪いのですが、実際の動作としてはランダム文字列なtoken文字列が変わってしまうだけなので、罠に落ちたことが分かりにくいと感じました。
 
* 具体的には、sfForm::disableCSRFProtection()でtoken生成時に使用する sfForm::$CSRFSecret というスタティックメンバ変数にfalseをセットしているのですが、この挙動自体もよくわかっておらず、長いsymfonyコード探索の旅に出ることになってしまいました。→[[スーパークラスのstaticなメンバ変数の挙動]]
 
* 具体的には、sfForm::disableCSRFProtection()でtoken生成時に使用する sfForm::$CSRFSecret というスタティックメンバ変数にfalseをセットしているのですが、この挙動自体もよくわかっておらず、長いsymfonyコード探索の旅に出ることになってしまいました。→[[スーパークラスのstaticなメンバ変数の挙動]]
 +
 +
[[Category:PHP]]
 +
[[Category:symfony]]

2013年4月20日 (土) 22:49時点における最新版

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