Codeigniter安全问题-持久的会话


Codeigniter security concern - Sessions that last forever?

在检查CodeIgniter的会话处理机制时,我发现了一些我认为非常令人担忧的问题。

$expire = $this->now - $this->sess_expiration;
$this->CI->db->where("last_activity < {$expire}");
$this->CI->db->delete($this->sess_table_name);

似乎CI实际上是根据last_activity而不是固定的、不可变的过期字段来确定会话过期时间的。

这里的问题是,无论何时更新会话,last_activity都会更新为now()。因此,假设您使用的是CI默认值,并且会话持续7200秒(2小时),每300秒(5分钟)更新一次

会话在上次更新后的5分钟后被标记为需要更新,因此,如果用户在这5分钟后但在2小时之前提交了会话cookie,则CI将从此时刻起将会话再延长2小时,因为last_activity将更新为now()。

对我来说,这似乎是一个巨大的安全风险,因为只要用户处于活动状态并不断触发会话更新,其持续时间就会无限期延长,有效地使过期设置变得毫无用处。我已经通过将更新设置为10秒并将过期设置为20来测试了这一点。我可以确认,只要我保持每10秒刷新一次,会话就不会过期!

想象一下,如果攻击者窃取了您的登录cookie并建立了一个有效的会话。即使您使登录cookie无效,只要攻击者经常提交cookie,他也可以无限期地保持会话有效。

你觉得怎么样?我是不是错过了什么重要的东西?或者,这真的像看上去那么严重的安全漏洞吗?

我认为你从评论中得到了要点,但简单地发布一个答案,你发现的是正确的函数。

会话是要"扩展"的,它们不是从最初的固定时间点创建的,到+7200秒。如果你是一个正在做某件事的人,突然当你处于活动状态时,你会被注销,这有点傻。

作为一种替代方法,如果您想执行您所描述的操作,您可以扩展CI_Session并修改该特定方法,并将其保存为MY_Session

点击此处查看更多详细信息:http://codeigniter.com/user_guide/general/core_classes.html