Я использую CodeIgniter версии 2.1.4 с Ion Auth в течение достаточно долгого времени и все отлично работал. Вчера я обновил Ion Auth до последней версии, и теперь я получаю ошибку CSRF всякий раз, когда пытаюсь «отредактировать» любой профиль пользователя.
«Эта форма сообщения не прошла нашу проверку безопасности».
Я получаю эту ошибку после изменения файла controllers/auth.php
, чтобы различные представления Ion Auth загружались в мой собственный шаблон. В конце концов, какой от этого прок, если я не могу интегрировать его в дизайн своего сайта. Однако я также получаю эту ошибку в более старой версии Safari, даже если контроллер auth.php
вообще не изменяется.
Это моя простая модификация файла контроллера auth.php
.
Заменил эту строку:
$view_html = $this->load->view($view, $this->viewdata, $render);
С помощью этой строки:
$view_html = $this->template->load('default', $view, $this->viewdata, $render);
Да, моя функция load
(в файле Template.php
, расположенном в /libraries/
) работала нормально с самого начала (много месяцев назад). Даже с новой версией Ion Auth моя функция загрузки шаблонов работает... однако я просто продолжаю получать ошибку безопасности, как описано выше.
После некоторых исследований причиной ошибки стала процедура безопасности CSRF от Ion Auth. Эти две функции вызываются во всем контроллере auth.php
и отображают указанную выше ошибку всякий раз, когда функция _valid_csrf_nonce()
возвращает false
.
function _get_csrf_nonce()
{
$this->load->helper('string');
$key = random_string('alnum', 8);
$value = random_string('alnum', 20);
$this->session->set_flashdata('csrfkey', $key);
$this->session->set_flashdata('csrfvalue', $value);
return array($key => $value);
}
function _valid_csrf_nonce()
{
if ($this->input->post($this->session->flashdata('csrfkey')) !== FALSE &&
$this->input->post($this->session->flashdata('csrfkey')) == $this->session->flashdata('csrfvalue'))
{
return TRUE; // <-- no error
}
else
{
return FALSE; // <-- error
}
}
В качестве временного (или постоянного?) обходного пути я включил параметр «Защита CSRF» в строке 298 в файле CodeIgniter config/config.php
.
$config['csrf_protection'] = TRUE; // enabled CSRF protection
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
Затем я отключил защиту от CSRF в Ion Auth, всегда возвращая true
из функции.
function _valid_csrf_nonce()
{
return TRUE;
}
Тем не менее, я действительно хочу понять первопричину здесь. Почему я получаю все эти ошибки CSRF, просто используя старые браузеры или пытаясь поместить представления Ion Auth в свои собственные шаблоны? Все находится на одном сервере с использованием одного и того же домена.
(редактировать: да, библиотека CI session
загружается автоматически и, по-видимому, работает нормально. В конце концов, я могу оставаться в системе.)