2

在检查 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 即可。

你怎么看?我在这里错过了一些重要的事情吗?或者这真的像看起来那样糟糕吗?

4

1 回答 1

1

我认为您从评论中明白了这一点,但简单地发布答案,您发现的是正确的功能。

会话被“延长”,它们不是从最初的固定时间点创建到 + 7200 秒。如果您是从事某项工作的人,并且在您处于活动状态时突然退出,这有点愚蠢。

作为一种替代方法,如果您想做您描述的事情,您可以扩展CI_Session并修改该特定方法,并将其另存为MY_Session.

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

于 2012-08-19T06:15:28.953 回答