cakephp 捕获“缺少CSRF Cookie类型或CSRF Cookie类型不正确”异常

cgh8pdjw  于 2022-11-12  发布在  PHP
关注(0)|答案(1)|浏览(192)

我知道为什么会引发此异常,这不是问题所在,但我无法捕获此异常。

  • 此异常在CORE/src/Http/Middleware/CsrfProtectionMiddleware.php第286行中抛出:*
if (!$cookie || !is_string($cookie)) {
   throw new InvalidCsrfTokenException(__d('cake', 'Missing or incorrect CSRF cookie type.'));
}

当我在CakePHP错误窗口中查看堆栈的长列表时,我很清楚我无法开始修改CORE文件,因为在下一次CakePHP更新/升级时,我的修改都丢失了。
我唯一可以修改并且应该很容易处理的脚本是webroot/index.php,它也在调用堆栈的第一个位置提到:
运行根目录/web根目录/index.php:50
我被困在这里。我试过的:

  • try/catch ( \Exception )
  • try/catch ( \Cake\Http\Exception\InvalidCsrfTokenException )
  • 使用set_exception_handler()

没有任何帮助,这意味着,我总是得到下面的错误窗口。在这个窗口中,你可以在左边看到很长的脚本调用栈,这些脚本被调用直到抛出异常。而且这甚至不是所有的脚本。所以它实际上是嵌套的。

我的问题:

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

kqhtkvqz

kqhtkvqz1#

您无法在index.php中捕获该异常,因为它已经被错误处理程序中间件捕获了,该中间件会显示一个漂亮的错误屏幕,但您只会在调试模式中看到该屏幕,以防您担心。
捕获该异常的第一个机会是一个自定义中间件,您必须将其放置在错误处理程序中间件和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;
}

相关问题