捕获 "Missing or incorrect CSRF cookie type." 异常

Catch "Missing or incorrect CSRF cookie type." exception

我知道为什么抛出这个异常,这不是问题,但我无法捕获这个异常。

此异常在 CORE/src/Http/Middleware/CsrfProtectionMiddleware.php 行 #286 中抛出:

if (!$cookie || !is_string($cookie)) {
   throw new InvalidCsrfTokenException(__d('cake', 'Missing or incorrect CSRF cookie type.'));
}

当我检查 CakePHP 中的长列表时,错误 window 我很清楚我无法像下一个 CakePHP 那样开始修改 CORE 文件update/upgrade 我的修改丢失了。

我唯一可以修改并且应该很容易处理的脚本是 webroot/index.php。在第一个位置的调用堆栈中也提到了它:

Cake\Http\Server->run ROOT/webroot/index.php:50

我卡在这里了。我试过什么:

没有任何帮助,这意味着,我总是收到以下错误 window。在此 window 中,您可以在左侧看到长长的脚本调用堆栈,这些脚本一直被调用直到抛出异常。这甚至不是所有的脚本。所以真的是嵌套了。

我的问题:

如何在最顶层的 PHP 脚本中捕获此异常 webroot/index.php - 在该脚本下方是另外 16 个脚本,直到抛出异常。我不想修改 CakePHP 核心文件。

我是运行蛋糕PHP4.1.4

您无法在 index.php 中捕获该异常,因为它已被错误处理程序中间件捕获,它会向您显示漂亮的错误屏幕,但是您只能在调试模式下看到它,以防万一那是你关心的问题。

您捕获该异常的第一个机会是 a custom middleware,您必须将其放置在错误处理程序中间件和 CSRF 保护中间件之间,大致如下:

// in src/Application.php

public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
{
    $middlewareQueue
        ->add(new ErrorHandlerMiddleware(Configure::read('Error')))

        // ...

        ->add(function (
            \Psr\Http\Message\ServerRequestInterface $request,
            \Psr\Http\Server\RequestHandlerInterface $handler
        ) {
            try {
                // continue with the next middleware
                return $handler->handle($request);
            } catch (\Cake\Http\Exception\InvalidCsrfTokenException $exception) {
                // handle the catched exception
                $response = new \Cake\Http\Response();

                return $response->withStringBody('Oh noes, CSRF error!');
            }
        })

        // ...
        
        ->add(new CsrfProtectionMiddleware([
            'httponly' => true,
        ]));

    return $middlewareQueue;
}