Почему сгенерированный токен защиты CSRF не сохраняется и не используется через SESSION, как предложено здесь ? В настоящее время в CI2 механизм защиты CSRF (в классе безопасности) таков:
1. Генерируйте уникальное значение для токена CSRF в функции _csrf_set_hash ():
$this->csrf_hash = md5(uniqid(rand(), TRUE));
2.Введите этот токен в скрытое поле формы (с помощью помощника form_open)
3. Пользователь отправляет форму, а сервер получает токен через POST. CI выполняет проверку токена в функции "_sanitize_globals ()" в классе Input:
$this->security->csrf_verify();
4.Функция "csrf_verify" класса Security, которая только что проверяет, установлена в POST ['token'] и POST ['token'] равна COOKIE ['token'];
public function csrf_verify(){
// If no POST data exists we will set the CSRF cookie
if (count($_POST) == 0)
{
return $this->csrf_set_cookie();
}
// Do the tokens exist in both the _POST and _COOKIE arrays?
if ( ! isset($_POST[$this->_csrf_token_name]) OR
! isset($_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();
}
// We kill this since we're done and we don't want to
// polute the _POST array
unset($_POST[$this->_csrf_token_name]);
// Nothing should last forever
unset($_COOKIE[$this->_csrf_cookie_name]);
$this->_csrf_set_hash();
$this->csrf_set_cookie();
log_message('debug', "CSRF token verified ");
return $this;
}
Почему бы не хранить токен в сеансе? ИМХО, просто проверка не является пустой POST ['token'] и равна COOKIE ['token'], потому что оба могут быть отправлены злым сайтом.