CakePHP: Руководство по CMS: получение InvalidCsrfTokenException, хотя защита csrf даже не активирована
Я установил CakePHP 4.0.6 на своем Lubuntu. Использование локального сервера Apache. Установка прошла успешно. Я вижу страницу приветствия.
Затем я запустил учебное пособие по CMS, создал таблицы в базе данных, а затем создал все с помощью bake./cake bake all --everything
Это тоже работало нормально, и я мог видеть /users/index
страница.
Затем, конечно, я попытался поиграть с cms, добавив пользователя, форма была показана, и я заполнил запрошенную информацию, но после отправки я получил эту ошибку:Отсутствует тело токена CSRF
Трассировки стека:
[Cake\Http\Exception\InvalidCsrfTokenException] Отсутствует тело токена CSRF в /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/src/Http/Middleware/CsrfProtectionMiddleware/CsrfProtectionMiddleware.php on line 25: Программное обеспечение /cakePhpTest/vendor/cakephp/cakephp/src/Http/Middleware/CsrfProtectionMiddleware.php:133 - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/src/Http/73 - home / php /david/Software/cakePhpTest/vendor/cakephp/cakephp/src/Http/Runner.php:58 - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/src/Routing/Middleware/RoutingMiddleware.php главная /david/Software/cakePhpTest/vendor/cakephp/cakephp/src/Http/Runner.php:73 - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/src/Routing/Middleware/AssetMiddleware.AssetMiddleware. - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/src/Http/Runner.php:73 - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/src/Error/Middleware/ErrorHandlerMiddleware.php:119 - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/src.php:73 - /home/david/Software/cakePhpTest/vendor/cakephp/debug_kit/src/Middleware/DebugKitMiddleware.php:60 - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/src/ src.php:73 - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/src/Http/Runner.php:58 - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/src/Http/Server.php:90 - /home/david/Software/cakePhpTest/webroot/index.php:40 URL-адрес запроса: / users / add Referer URL:73 - /home/david/Software/cakePhpTest/vendor/cakephp/debug_kit/src/Middleware/DebugKitMiddleware.php:60 - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/cakephp/cakephp/cakephp/cakephp/cakephp/cakephp/cakephp/cakephp/cunner 73 - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/src/Http/Runner.php:58 - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/src/Http/: 90 - /home/david/Software/cakePhpTest/webroot/index.php:40 URL-адрес запроса: / users / add Referer URL:73 - /home/david/Software/cakePhpTest/vendor/cakephp/debug_kit/src/Middleware/DebugKitMiddleware.php:60 - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/cakephp/cakephp/cakephp/cakephp/cakephp/cakephp/cakephp/cakephp/cunner 73 - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/src/Http/Runner.php:58 - /home/david/Software/cakePhpTest/vendor/cakephp/cakephp/src/Http/: 90 - /home/david/Software/cakePhpTest/webroot/index.php:40 URL-адрес запроса: / users / add Referer URL: http://localhost:8765/users/add IP-адрес клиента: 127.0.0.1
Что меня действительно озадачивает, так это то, что, согласно документации CakePHP, защита от подделки межсайтовых запросов должна быть включена вsrc/Application.php
которого нет в недавно установленном проекте. Я проверил.
Итак, как то, что не включено, может вызвать ошибку.
Чтобы увидеть, что произойдет, если я включу его, я скопировал код из документации:
use Cake\Http\Middleware\CsrfProtectionMiddleware;
...
$options = [
// ...
];
$csrf = new CsrfProtectionMiddleware($options);
к src/Application.php
. Это привело к той же ошибке.
1 ответ
В каркасе приложения по умолчанию промежуточное ПО CSRF регистрируется в области маршрутизации, нечто подобное показано во втором примере связанных документов.
$routes->scope('/', function (RouteBuilder $builder) { // Register scoped middleware for in scopes. $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([ 'httpOnly' => true, ])); /* * Apply a middleware to the current route scope. * Requires middleware to be registered through `Application::routes()` with `registerMiddleware()` */ $builder->applyMiddleware('csrf'); // ... });
https://github.com/cakephp/app/blob/4.0.3/config/routes.php
Увидеть ваш config/routes.php
файл и настройте / удалите промежуточное ПО в соответствии с вашими потребностями.
Если вы хотите использовать промежуточное программное обеспечение CSRF, обязательно удалите свои файлы cookie для домена, в файлы cookie токенов CSRF внесены изменения, которые в настоящее время несовместимы с существующими файлами cookie токенов CSRF, см. https://github.com/cakephp/cakephp/issues/14471.