Cakephp PHP WEB開発

【Cakephp4】CSRFとFormProtectionを無効にする方法

※本サイトはPR表記を含みます。

Cakephp4でCSRFなどの基本セキュリティは必ず有効にしておくべきですが、やむを得ず、一時的に無効にしたい場合もあるかもしれません。そのような場合は以下のようにして各コントローラ、またはアクションごとにCSRFを無効にする方法が考えられます。

CSRFチェックを無効にする

src/Application.php

/**
 * Setup the middleware queue your application will use.
 *
 * @param \Cake\Http\MiddlewareQueue $middlewareQueue The middleware queue to setup.
 * @return \Cake\Http\MiddlewareQueue The updated middleware queue.
 */
public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
{
    $csrf = new CsrfProtectionMiddleware([
        'secure' => true,
        'httponly' => true,
    ]);

    // CSRF無効対象のコントローラ。アクションも対応できる
    $csrf->skipCheckCallback(function ($request) {
        if ($request->getParam('controller') === 'hogesController') {
            return true;
        }
    });

    $middlewareQueue
       // 略
        // Cross Site Request Forgery (CSRF) Protection Middleware
        // https://book.cakephp.org/4/en/security/csrf.html#cross-site-request-forgery-csrf-middleware
        ->add($csrf) // ここで$csrfをaddしておく

    return $middlewareQueue;
}

■ Cakephp4: CSRFプロテクション
https://book.cakephp.org/4/ja/security/csrf.html#id3

本来はAJAX通信でも、きちんとCSRFトークンを埋め込んでおくべきではあります。

 

FormProtectionを無効にする

FormProtectionはデフォルトで有効にしておくべきですが、同時にAJAX通信などでは、改ざん対象になってしまうので、無効が必要な場合もあると思います。

/**
 * アクション実行前に実行する処理
 *
 * @param \Cake\Event\EventInterface $event An event instance
 * @return \Cake\Http\Response|null|void
 */
public function beforeFilter(EventInterface $event)
{
    parent::beforeFilter($event);

    $this->FormProtection->setConfig('validate', false);
}

-Cakephp, PHP, WEB開発
-