Промежуточное программное обеспечение CSRF не активируется - PullRequest
0 голосов
/ 04 апреля 2019

Вот что у меня есть

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);
    });
});

Что я делаю

Сделайте POST-запрос к /api/users, используя Почтальон . Запрос проходит, и я вижу правильный ответ. Я хочу убедиться, что у меня включена защита для остальной части сайта, поэтому я ожидаю одну из тех ошибок Missing CSRF cookie . После подтверждения я раскомментирую исключение маршрута API.

Что я пробовал

  • Следуйте controllers / middleware.html # csrf-middleware и поместите вызов registerMiddleware() в src/Application.php
  • Добавьте немного тарабарщины в applyMiddleware() вызов. Он жалуется, что не может найти то промежуточное ПО, которое подтверждает, что функция вызывается
  • Поместите $this->loadComponent('Csrf'); в AppController.php. Это работает, и я получаю Missing CSRF cookie-токен . Это не показывает мне предупреждение о конфликтующих компонентах как эта страница говорит, что должно

У меня сложилось впечатление, что промежуточное программное обеспечение не было включено должным образом, но мне не очевидно, что именно не так. Пожалуйста, помогите

1 Ответ

0 голосов
/ 04 апреля 2019

Оказывается, это была правильная установка.

Я не осознавал, что более низкий Router::prefix вызов без промежуточного программного обеспечения сведет на нет вышеупомянутый Router::scope вызов (т. Е. Действует как исключение), но он это сделал.

...