Posted at

#CakePHP 2.3.9 にてフォームでポスト可能な時間(Security->csrfExpires)を変更したときのメモ

More than 3 years have passed since last update.


背景


  • じっくり考えながら入力するようなフォームで初期値の30分では足らず、投稿できないという現象がしばしば発生したため、30分より長い時間を許容したいということから。

  • CakePHP のバージョンは 2.3.9


Security->csrfExpires とは?


  • CSRF token が作成されてからの有効期限。

    (CSRF protectionが有効な時フォーム系で画面を開いてからポストするまでの有効期限。)

  • フォーム画面を開いてからポストする時にこの時間を超えるとblackHole()が呼ばれる模様。

  • 公式ドキュメント

    http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html

    ※2系は英語版のみの模様。


初期値は30分


  • CakePHP 2.3.9においてはlib/Cake/Controller/Component/SecurityComponent.phppublic $csrfExpires = '+30 minutes';と設定してある様子。


変更するには Controller で値を上書き


  • 方法1: Controller の $components に記載する方法。 Controller 全体で変更したいときなど。


CakePHP

public $components = array(

'Security' => array(
'csrfExpires' => '+1 hour'
)
);


  • 方法2: Controller の beforeFilter() に記載する方法。 特定のactionでのみ変更したいときなど。


CakePHP

public function beforeFilter() {

parent::beforeFilter();
$this->Security->csrfExpires = '+1 hour';
}


変更する際の注意点


  • CakePHP 2.3.9においてはlib/Cake/Controller/Component/SecurityComponent.php$token['csrfTokens'][$authKey] = strtotime($this->csrfExpires);にてstrtotime()の引数に直接csrfExpiresの値を渡している様子。

    有効期限を1時間にしたいなら'+1 hour'40分にしたいなら'+40 minutes'とする必要がある。

    初期値の30分から±するという意味ではない。過去の日時になる'-1 minute'などにすると直ちに有効期限が切れる。

    http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html#SecurityComponent::$csrfExpires