在 codeigniter 中使用 HTTPOnly 标志设置 cookie

Posted

技术标签:

【中文标题】在 codeigniter 中使用 HTTPOnly 标志设置 cookie【英文标题】:setting cookies with HTTPOnly flags in codeigniter 【发布时间】:2012-05-18 10:13:12 【问题描述】:

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

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

$config['cookie_secure'] = TRUE;

但 config.php 中没有 HTTPOnly 选项。

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

【问题讨论】:

【参考方案1】:

幸运的是,您可以在 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。

【讨论】:

这在 2.1.3 版中不再有效,如下面评论中所述。【参考方案2】:

我发现他们在 codeigniter 的 session mgmt 中是一个 drwaback,因为

-

    2.1.3 版本没有 cookie_httponly 标志。 解决方案: 步骤1:您需要在库中创建自己的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.

    即使您添加“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 
         );`
    

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

【讨论】:

【参考方案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
            );

【讨论】:

我可以在我的测试中确认这一点,你知道如何设置吗?【参考方案4】:

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

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

$config['cookie_httponly'] = TRUE;

【讨论】:

以上是关于在 codeigniter 中使用 HTTPOnly 标志设置 cookie的主要内容,如果未能解决你的问题,请参考以下文章

在 codeigniter 中使用 HTTPOnly 标志设置 cookie

在视图中使用 foreach 的 Codeigniter

使用codeIgniter在MySQL中查找表是不是存在?

在模型中使用查询的 Codeigniter 分页

在 codeigniter 中使用聚合函数更新列

使用 PHP/CodeIgniter 在 MySQL 中获取最后执行的查询