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); }
■Cakephp4: FormProtection
https://book.cakephp.org/4/ja/controllers/components/form-protection.html#id4