CodeIgniter 2, Ion Auth выдает сообщение об ошибке CSRF при редактировании профиля
Я давно пользуюсь 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
Библиотека загружается автоматически и работает нормально. Я могу оставаться в системе, в конце концов.)
1 ответ
Я никогда не доходил до первопричины, однако у меня есть теория, которая могла бы объяснить кое-что из этого:
Защита от ионной аутентификации CSRF зависит от flashdata
, где flashdata
выживает только "следующий" звонок на сервер. Мой пользовательский загрузчик шаблонов может дважды вызывать сервер, так как он сначала вызывает мою функцию загрузчика, на которой создается страница, а затем вызывает функцию просмотра CodeIgniter.
Однако эта теория на самом деле не объясняет, почему неизмененная версия Ion Auth по-прежнему не работает в Safari. Не стесняйтесь опубликовать другой ответ, если вы можете добавить к этому что-то существенное или убедительное.
Согласно личному ответу Бена Эдмундса, разработчика Ion Auth...
"Мы добавили защиту CSRF в примеры Ion Auth до того, как CI встроил их в платформу, поэтому вам лучше всего просто удалить их из примера контроллера Ion Auth и просмотреть, если вы используете более новую версию CI со встроенной".
Поскольку я уже использую последнюю версию CodeIgniter (2.1.4), я решил пойти по этому пути.
Временный обход из моего OP теперь постоянен:
Я включил параметр "Защита CSRF" в строке 298 в файле CodeIgniter config/config.php.
$config['csrf_protection'] = TRUE; // enabled CSRF protection
Затем я подавил защиту CSRF в Ion Auth, всегда возвращая true
из этой функции.
function _valid_csrf_nonce()
{
return TRUE; // effectively disables Ion Auth's CSRF protection
}
И, наконец, разработчик комментирует использование взамен защиты CSRF CodeIgniter:
"Круто, это действительно лучшее решение, так как оно интегрировано в ваше приложение".