
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