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 загружается автоматически и, по-видимому, работает нормально. В конце концов, я могу оставаться в системе.)


person Sparky    schedule 31.10.2013    source источник


Ответы (1)


Я так и не добрался до первопричины, однако у меня есть теория, которая могла бы объяснить кое-что из этого:

Защита Ion Auth CSRF зависит от flashdata, где flashdata переживает только «следующий» вызов сервера. Мой пользовательский загрузчик шаблонов может вызывать сервер дважды, поскольку он сначала вызывает мою функцию загрузчика, в которой создается страница, а затем вызывает функцию представления CodeIgniter.

Однако эта теория на самом деле не объясняет, почему немодифицированная версия Ion Auth по-прежнему не работает в Safari. Не стесняйтесь публиковать еще один ответ, если вы можете добавить к этому что-то существенное или убедительное.


Согласно личному ответу Бена Эдмундса, разработчика Ion Auth...

"Мы добавили защиту CSRF к примерам Ion Auth до того, как CI встроил их в платформу, поэтому вам лучше просто удалить их из примера контроллера и представлений Ion Auth, если вы используете более новую версию CI со встроенным ."

Поскольку я уже использую последнюю версию CodeIgniter (2.1.4), я решил пойти по этому пути.

Временный обходной путь из моего ОП теперь постоянный:

Я включил опцию «Защита CSRF» в строке 298 в файле config/config.php CodeIgniter.

$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:

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

person Sparky    schedule 01.11.2013
comment
Спасибо, что ответили на свой вопрос. Это кажется отличным решением проблемы - person Wouter Vanherck; 29.10.2018