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:

"Круто, это действительно лучшее решение, так как оно интегрировано в ваше приложение".

Другие вопросы по тегам