你如何在 CodeIgniter 中实现这一点?
6 回答
(这个答案是对原始问题的回应)
你会怎么做?或者,您将如何创建一个过期日期比其他会话更长的会话?
所有创建的会话都将在配置文件中使用相同的 $config['sess_expiration'](默认值:7200 秒),有没有办法传递自定义值?
延长会话 cookie 的有效期不适用于“记住我”功能,因为用户在关闭浏览器时会丢失会话 cookie。如果 Code Igniter 没有原生的“记住功能”,那么您需要编写一些东西来删除一个长寿命的 cookie,其中包含允许在服务器再次看到它时自动登录的信息。
有一篇关于Persistent Login Cookie Best Practice的好文章,可以总结为:
- 当用户在选中记住我的情况下成功登录时,除了标准会话管理 cookie 之外,还会发出一个登录 cookie。2
- 登录 cookie 包含用户的用户名和一个来自适当大空间的随机数(从这里开始的“令牌”)。用户名和令牌作为一对存储在数据库表中。
- 当未登录用户访问该站点并显示登录 cookie 时,会在数据库中查找用户名和令牌。1. 如果该对存在,则认为用户已通过身份验证。使用的令牌将从数据库中删除。生成一个新令牌,与用户名一起存储在数据库中,并通过新的登录 cookie 发给用户。2. 如果该对不存在,则忽略登录 cookie。
- 仅通过此机制进行身份验证的用户不得访问某些受保护的信息或功能,例如更改密码、查看个人身份信息或花钱。要执行这些操作,用户必须首先成功提交正常的用户名/密码登录表单。
- 由于这种方法允许用户从不同的浏览器或计算机中获得多个记住的登录信息,因此为用户提供了一种机制,可以在一次操作中清除所有记住的登录信息。
另一篇文章在改进的持久登录 Cookie 最佳实践中为这些想法构建了更多安全性
如果您遵循这些文章中的做法,您将不会出错!
您可能需要重新考虑“改进的持久登录 Cookie 最佳实践”中的建议。我已经在网站上发布了我对问题的分析,但它的要点是:
无论如何,如果没有安全线路,您将无法防止 cookie 窃取
(*“安全线路”是指 SSL / VPN 隧道 / 公钥加密 - 或强大的质询 - 响应方案 *)
我完全赞成持久登录的最佳实践,但在某一点上,再多的诡计也无济于事,而唯一的出路就是 SSL。
感谢您的解决方案。我已经在我的 CI 项目中实现了这一点。
开发人员注意:cookie 应该有一个安全散列作为记住我的密钥。- 不只存储用户 ID) - 不存储密码, - 不存储密码哈希。这样人们就无法自动登录任何帐户。
最坏的情况:一旦黑客发现哈希方法,您可以在一个地方调整密钥生产者功能,并重新设置安全性。我只是调整盐和胡椒串。
希望有帮助。Chris D. - 来自澳大利亚 :)
对于这些东西,所有类中的CI变量都可以通过自己的库来访问:
例如:
$this->session->sess_expiration = 500000;
希望能解决您的问题。
github上有图书馆,记得我下载它。
使用这个库的 setCookie() 函数,会发生以下情况:
1. 生成一个包含唯一编号的 cookie 该编号被记录到数据库表中,称为 ci_cookies 以及传递给 setCookie() 的 netid/用户名
2.verifyCookie()函数被调用时,浏览器的cookie hash必须匹配记录到数据库的hash。如果是,verifyCookie() 返回 true 转发到主页
你需要在加载会话之前设置 conf
$do_not_remember = (boolean) $this->input->post('do_not_remember');
if ($do_not_remember) {
$this->config->set_item('sess_expiration', 0);
$this->config->set_item('sess_expire_on_close', true);
}
$this->load->library('session');