Чтобы исправить это, ue, мне пришлось изменить код файла «Security.php», расположенный в «system/core /».
В функции "csrf_verify", замените этот код:
// Do the tokens exist in both the _POST and _COOKIE arrays?
if (! isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]))
{
$this->csrf_show_error();
}
// Do the tokens match?
if ($_POST[$this->_csrf_token_name] != $_COOKIE[$this->_csrf_cookie_name])
{
$this->csrf_show_error();
}
К этому коду:
// Do the tokens exist in both the _POST and _COOKIE arrays?
if (! isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name])) {
// No token found in $_POST - checking JSON data
$input_data = json_decode(trim(file_get_contents('php://input')), true);
if ((!$input_data || !isset($input_data[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name])))
$this->csrf_show_error(); // Nothing found
else {
// Do the tokens match?
if ($input_data[$this->_csrf_token_name] != $_COOKIE[$this->_csrf_cookie_name])
$this->csrf_show_error();
}
}
else {
// Do the tokens match?
if ($_POST[$this->_csrf_token_name] != $_COOKIE[$this->_csrf_cookie_name])
$this->csrf_show_error();
}
Этот код сначала проверяет $ _POST то, если ничего не найдено, он проверяет полезную нагрузку JSON ,
Идеальный способ сделать это - проверить значение входящего запроса Content-Type. Но удивительно, что это не прямо ...
Если у кого-то есть лучшее решение, отправьте его здесь.
Приветствия
Лучше всего это сделать, расширив библиотеку безопасности, вместо того, чтобы изменять основной файл непосредственно в системе/ядре. Создайте My_Security.php в приложении/ядре и переопределите csrf_verify(). Подробнее о том, как это сделать: https://ellislab.com/codeigniter/user-guide/general/core_classes.html –