Безопасность cookie_secure CSRF не работает

0

В настоящее время я использую Codeigniter и хотел бы включить в config.php:

$config['cookie_secure']    = TRUE; 

Я также использую:

$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = '***';
$config['csrf_cookie_name'] = '***';
$config['csrf_expire'] = 7200;

Соединение - только https. Но когда я использую параметр cookie_secure, CSRF больше не работает и дает следующее:

The action you have requested is not allowed.

Codeigniter не может хранить CSRF в cookie из-за этой меры. Как я могу это решить? Мне нравится использовать обе меры безопасности.

<--- EDIT --->

<form action="<?php echo base_url().'login/'; ?>" method="post">

  <?php echo form_hidden($this->security->get_csrf_token_name(), $this->security->get_csrf_hash()); ?>
  • 0
    Какую версию CI вы используете?
  • 0
    Кроме того, у вас на самом деле есть *** качестве имени вашего токена? Я предполагаю, что нет, но, пожалуйста, приведите пример.
Показать ещё 6 комментариев
Теги:
csrf
codeigniter
cookies

3 ответа

1

Я cookie_secure с той же проблемой, когда у меня было установлено оба cookie_secure true, а csrf_protection - true.

Я впервые заметил, что cookie CSRF не был установлен.

Посмотрев на csrf_set_cookie() в /system/core/Security.php, вы увидите:

/**
 * Set Cross Site Request Forgery Protection Cookie
 *
 * @return  object
 */
public function csrf_set_cookie()
{
    $expire = time() + $this->_csrf_expire;
    $secure_cookie = (config_item('cookie_secure') === TRUE) ? 1 : 0;

    if ($secure_cookie && (empty($_SERVER['HTTPS']) OR strtolower($_SERVER['HTTPS']) === 'off'))
    {
        return FALSE;
    }

    setcookie($this->_csrf_cookie_name, $this->_csrf_hash, $expire, config_item('cookie_path'), config_item('cookie_domain'), $secure_cookie);

    log_message('debug', "CRSF cookie Set");

    return $this;
}

Хотя, как и большинство, я использую балансировку нагрузки для завершения SSL. Отдельные серверы не знают, что трафик превышает HTTPS, поскольку трафик отправляется на каждый сервер по порту 80 во внутренней сети. Для этого необходим HTTP_X_FORWARDED_PROTO.

Я закончил переписывание csrf_set_cookie() в моем /application/core/MY_Security.php чтобы исправить это:

/**
 * Set Cross Site Request Forgery Protection Cookie
 *
 * @return  object
 */
public function csrf_set_cookie()
{
    $expire = time() + $this->_csrf_expire;
    $secure_cookie = (config_item('cookie_secure') === TRUE) ? 1 : 0;

    if (
        $secure_cookie &&
        (empty($_SERVER['HTTPS']) OR strtolower($_SERVER['HTTPS']) === 'off') &&
        (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] != 'https')
    ) {
        return FALSE;
    }

    setcookie($this->_csrf_cookie_name, $this->_csrf_hash, $expire, config_item('cookie_path'), config_item('cookie_domain'), $secure_cookie);

    log_message('debug', "CRSF cookie Set");

    return $this;
}
0

Если вы хотите решить эту ошибку CODEIGNITER BUG, вы можете установить такую, как показано ниже:

$config['sess_cookie_name'] = 'ci_projectname_session';

...

...

$config['cookie_prefix']    = 'ci_projectname_';

В качестве примера выше, префикс cookie и имя файла cookie должны начинаться одинаково.

0

Похоже, что это может решить проблему, убедитесь, что у вас есть form_open() в вашем коде. В документации по помощнику формы codeigniter,

Создает тег формы открытия с базовым URL-адресом...

Это также должно добавить csrf автоматически без form_hidden().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню