捕获 "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
我卡在这里了。我试过什么:
try/catch ( \Exception )
try/catch ( \Cake\Http\Exception\InvalidCsrfTokenException )
- 使用
set_exception_handler()
没有任何帮助,这意味着,我总是收到以下错误 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;
}
我知道为什么抛出这个异常,这不是问题,但我无法捕获这个异常。
此异常在 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
我卡在这里了。我试过什么:
try/catch ( \Exception )
try/catch ( \Cake\Http\Exception\InvalidCsrfTokenException )
- 使用
set_exception_handler()
没有任何帮助,这意味着,我总是收到以下错误 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;
}