CSRF 中间件没有被激活
CSRF middleware doesn't get activated
这是我的
Cakephp 3.7.2;在我的 routes.php
:
<?php
use Cake\Core\Plugin;
use Cake\Routing\RouteBuilder;
use Cake\Routing\Router;
use Cake\Routing\Route\DashedRoute;
use Cake\Http\Middleware\CsrfProtectionMiddleware;
Router::defaultRouteClass(DashedRoute::class);
Router::scope('/', function (RouteBuilder $routes) {
$routes->registerMiddleware('csrf', new CsrfProtectionMiddleware());
$routes->applyMiddleware('csrf');
$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
$routes->fallbacks(DashedRoute::class);
});
/*
Router::scope('/api', function ($routes) {
// connect routes with *no* CSRF protection as that middleware is not active
// for this routing scope.
});
*/
Router::prefix('api', function ($routes) {
$routes->prefix('users', function ($routes) {
$routes->fallbacks(DashedRoute::class);
});
});
我在做什么
使用 Postman 向 /api/users
发出 POST 请求。请求通过,我看到了正确的响应。我想确保为网站的其余部分启用了保护,所以我期待其中一个 Missing CSRF token cookie 错误。一旦确认,我将取消注释 API 路由异常。
我试过的
- 关注 controllers/middleware.html#csrf-middleware 并将
registerMiddleware()
调用放入 src/Application.php
- 在
applyMiddleware()
调用中添加一些乱码。它抱怨找不到那个中间件,这证实了函数确实被调用了
- 将
$this->loadComponent('Csrf');
放入AppController.php
。它有效,我确实得到了 缺少 CSRF 令牌 cookie。它没有向我显示 关于组件冲突的警告,就像 this page 说的那样
我的印象是中间件没有正确启用,但我不清楚究竟是哪里出了问题。请协助
事实证明这实际上是正确的设置。
我没有意识到没有中间件的较低 Router::prefix
调用会否定上面的 Router::scope
调用(即作为例外),但它确实如此。
这是我的
Cakephp 3.7.2;在我的 routes.php
:
<?php
use Cake\Core\Plugin;
use Cake\Routing\RouteBuilder;
use Cake\Routing\Router;
use Cake\Routing\Route\DashedRoute;
use Cake\Http\Middleware\CsrfProtectionMiddleware;
Router::defaultRouteClass(DashedRoute::class);
Router::scope('/', function (RouteBuilder $routes) {
$routes->registerMiddleware('csrf', new CsrfProtectionMiddleware());
$routes->applyMiddleware('csrf');
$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
$routes->fallbacks(DashedRoute::class);
});
/*
Router::scope('/api', function ($routes) {
// connect routes with *no* CSRF protection as that middleware is not active
// for this routing scope.
});
*/
Router::prefix('api', function ($routes) {
$routes->prefix('users', function ($routes) {
$routes->fallbacks(DashedRoute::class);
});
});
我在做什么
使用 Postman 向 /api/users
发出 POST 请求。请求通过,我看到了正确的响应。我想确保为网站的其余部分启用了保护,所以我期待其中一个 Missing CSRF token cookie 错误。一旦确认,我将取消注释 API 路由异常。
我试过的
- 关注 controllers/middleware.html#csrf-middleware 并将
registerMiddleware()
调用放入src/Application.php
- 在
applyMiddleware()
调用中添加一些乱码。它抱怨找不到那个中间件,这证实了函数确实被调用了 - 将
$this->loadComponent('Csrf');
放入AppController.php
。它有效,我确实得到了 缺少 CSRF 令牌 cookie。它没有向我显示 关于组件冲突的警告,就像 this page 说的那样
我的印象是中间件没有正确启用,但我不清楚究竟是哪里出了问题。请协助
事实证明这实际上是正确的设置。
我没有意识到没有中间件的较低 Router::prefix
调用会否定上面的 Router::scope
调用(即作为例外),但它确实如此。