在 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的主要内容,如果未能解决你的问题,请参考以下文章