在检查 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 即可。
你怎么看?我在这里错过了一些重要的事情吗?或者这真的像看起来那样糟糕吗?