13

我想知道如何在 Codeigniter 中将 cookie 设置为 HTTPOnly。我查看了文档,但没有看到如何设置此标志。

我还想为 cookie 设置安全标志,并在 config.php 文件中找到它:

$config['cookie_secure'] = TRUE;

但是 config.php 中没有 HTTPOnly 选项。

如何将所有 cookie 设置为 HTTPOnly?如果它是在框架中完成的,那么知道该代码在哪里供我自己学习(以及默认值是什么)会很有帮助。

4

4 回答 4

30

幸运的是,您可以在 GitHub 上查看Session.php的源代码

在函数_set_cookie中,您将看到:

// Set the cookie
setcookie(
    $this->sess_cookie_name,
    $cookie_data,
    $expire,
    $this->cookie_path,
    $this->cookie_domain,
    $this->cookie_secure,
    $this->cookie_httponly
);

的值$this->cookie_httponly已分配,__construct默认值为 FALSE,但您可以通过config.php以下方式将其设置为 TRUE:

$config['cookie_httponly'] = TRUE;

这将使框架内的 cookie 成为 HTTPOnly。

于 2012-05-09T21:03:19.387 回答
10

我发现他们是 codeigniter 会话管理中的一个 drwaback,因为

-

  1. 2.1.3 版本他们没有 cookie_httponly 标志。
    解决方法:
    第一步:需要在库中创建自己的 My_session.php 并扩展系统会话文件或修改 Session.php(在 system->library->Session.php 文件中)
    第二步:找到 _set_cookie($cookie_data = NULL) 函数, 转到 setcookie() 并修改为

    setcookie( $this->sess_cookie_name, $cookie_data, $expire,
    $this->cookie_path, $this->cookie_domain, $this->cookie_secure, TRUE ); // add True flag.

  2. 即使您添加“TRUE”并且如果使用 OWASP ZAP 工具进行测试,
    有时它也会给您带来 CSRF 问题
    ,即:HTTPONLY 不正确,
    安全标志未启用。

    原因:因为在 sess_destroy 时,他们将 HTTPONLY 和 Secure 标志设置为 none。
    解决方案:将 Session.php 中的 sess_destroy 函数更新为

     // Kill the cookie 
    `setcookie(
              $this->sess_cookie_name,
             addslashes(serialize(array())),
             ($this->now - 31500000),
             $this->cookie_path,
             $this->cookie_domain,
             TRUE,
             TRUE 
         );`
    

由于这些问题让我彻夜难眠,所以我希望这对你也有帮助。:)

于 2014-04-27T10:07:08.593 回答
3

2.1.3 的 foreach 中不包含 cookie_httponly,所以不会设置它。

foreach (array('sess_encrypt_cookie', 'sess_use_database', 'sess_table_name', 'sess_expiration', 'sess_expire_on_close', 'sess_match_ip', 'sess_match_useragent', 'sess_cookie_name', 'cookie_path', 'cookie_domain', 'cookie_secure', 'sess_time_to_update', 'time_reference', 'cookie_prefix', 'encryption_key') as $key)

它也没有在这里设置...

    setcookie(
                $this->sess_cookie_name,
                $cookie_data,
                $expire,
                $this->cookie_path,
                $this->cookie_domain,
                $this->cookie_secure
            );
于 2012-11-21T14:31:54.187 回答
0

此功能现在在 v2 中确实存在,请参阅此 config.php:

| 'cookie_httponly' = Cookie 只能通过 HTTP(S) 访问(无 javascript)

$config['cookie_httponly'] = 真;

于 2018-10-02T02:18:18.123 回答