CodeLab技術ブログ

プログラミング技術まとめ

[CakePHP3.7]CSRF保護について

フォームのhiddenデータの保護のための仕組みのCSRFが、CakePHP3.5から変更になったようなので調査してみました。

バージョン
CakePHP 3.8

スポンサードリンク

CsrComponentは廃止

今まで用いられてきたCsrComponentは廃止されました。

これに変わり、クロスサイトリクエストフォージェリー (CSRF) ミドルウェア(CsrfProtectionMiddleware )が追加されました。

CSRFを使わない場合

とりあえず、CSRFを使わないぜ!という場合は、config/rutes.phpにある、

// config/rutes.php
$routes->registerMiddleware('csrf', new CsrfProtectionMiddleware([
   'httpOnly' => true
]));
$routes->applyMiddleware('csrf');

因みに、他のバージョンの場合、方法が異なります。
3.0~3.4,
3.5~3.6
3.7~ の3パターンがあるようです。
詳しくはこちらの記事を読むといいかと思います。

[CakePHP3]AjaxからのPOSTが403エラーになる問題の対処法
https://www.t3a.jp/blog/web-develop/cakephp-ajax-post-error/

いやいや、変わりすぎだろう。CaKe3の開発計画は本当にひどすぎる。

コントローラー、アクションごとにCSRFを使う/使わないを制御したい場合

実は、どのURIでCSRFを有効にするかどうかを設定しているのは

スポンサードリンク
$routes->applyMiddleware('csrf');

この行がになっています。
ここまでの行で、scopeの設定がないので、サイト全体で使うという設定になるようです。

ですので特定のURLでする場合は・・・

// /blogs で有効にする
$routes->scope('/blogs', function ($routes) {
    $routes->applyMiddleware('csrf');
});
// /blogs/* で有効にする
$routes->connect('/blogs/:action', ['controller' => 'Blogs'])->setMiddleware(['csrf']);

コントローラー、アクションごとにCSRFを使う/使わないを制御したい場合 その2

実は、今までと同じコンポーネントでやる方法もあるようです。

まず、config/rutes.php のapplyMiddlewareの設定を消して
各コントローラ―(AppController.phpでもいいけど)で

//各コントローラ―でloadコンポーネントする
class HogeController extends AppController
{
    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('Csrf');
    }
  public function beforeFilter(Event $event) {
        //アクションごとにON/OFF
        if($this->request->action == 'edit'){
            $this->getEventManager()->off($this->Csrf);  //OFFにする
        }
    }
}

うーん。これでいいなら、今までのままでよくね?と思うのは私だけだろうか…。

スポンサードリンク
スポンサードリンク

コメントは受け付けていません。