Я относительно новичок в CakePHP (v3.7).У меня есть приложение, в котором я получаю сообщение об ошибке «Missing Csrf Token Cookie».
В Application.php у меня есть:
$options = []; // I'm fine with the default options.
$csrf = new CsrfProtectionMiddleware($options);
$middlewareQueue->add($csrf);
Страница формы содержит скрытый элемент формыс _csrfToken в нем.Я запутался, почему его не нашли на POST?
Копая дальше, я обнаружил, что в CsrfProtectionMiddleware.php функция _validateToken () нижеведет себя следующим образом:
$ cookie равно null (нет установленных cookie-файлов). Таким образом, $ cookie равно null .
$ post фактически содержит содержимое параметра _csrfToken из скрытого параметра на странице.Однако функция никогда не смотрит на это.Поскольку $ cookie равно нулю, оператор if (! $ Cookie) вызывает исключение InvalidCsrfTokenException .
protected function _validateToken(ServerRequest $request)
{
$cookies = $request->getCookieParams();
$cookie = Hash::get($cookies, $this->_config['cookieName']);
$post = Hash::get($request->getParsedBody(), $this->_config['field']);
$header = $request->getHeaderLine('X-CSRF-Token');
if (!$cookie) {
throw new InvalidCsrfTokenException(__d('cake', 'Missing CSRF token cookie'));
}
if (!Security::constantEquals($post, $cookie) && !Security::constantEquals($header, $cookie)) {
throw new InvalidCsrfTokenException(__d('cake', 'CSRF token mismatch.'));
}
}
}
Очевидно,промежуточное ПО ожидает скрытый параметр фактических cookie.Где этот куки установлен (или должен быть установлен?)
Обновление:
Я проверил на стороне браузера.Файл cookie устанавливается, но браузер не возвращает его по запросу POST.
Вот ОТВЕТ CakePHP на исходный запрос GET для заполнения страницы:
Connection: Keep-Alive
Content-Length: 3013
Content-Type: text/html; charset=UTF-8
Date: Wed, 08 May 2019 23:07:31 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.33 (Unix) PHP/7.1.1
Set-Cookie: csrfToken=b553dd2e06e57f6d514ee41a120e1c60084adafddfbaa6f72db1f7f590fcf50143876ac817d29d6f1cf9a786031d6235ba21e265b9d3b2a0ee4535854f048b66; path=/webroot/
X-Powered-By: PHP/7.1.1
Обратите внимание на csrfTokenпеченье.... и вот POST, который браузер отправляет обратно с данными формы
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 184
Content-Type: application/x-www-form-urlencoded
DNT: 1
Host: *************
Origin: ****************
Pragma: no-cache
Referer: ***************
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36
Параметры строки запроса
redirect: /Users/login
Данные формы
_method: POST
_csrfToken: b553dd2e06e57f6d514ee41a120e1c60084adafddfbaa6f72db1f7f590fcf50143876ac817d29d6f1cf9a786031d6235ba21e265b9d3b2a0ee4535854f048b66
username: xxxxxxxxxx
password: xxxxxxxxxx
Обратите внимание, чтоон отправляет обратно скрытый параметр формы _csrfToken , но НЕ cookie.
Спасибо за любую помощь ...