在检查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就足够了。
你怎么看?我错过了一些重要的东西吗?或者这是否真的像它出现的安全漏洞一样糟糕?答案 0 :(得分:1)
我认为你从评论中得到了重点,但只是发布一个答案,你发现的是正确的功能。
会话是“扩展”的,它们不是从最初的固定时间点创建到+ 7200秒。如果你是一个正在做某事的人,而且在你活跃的时候突然间,你会有点傻。
作为替代方法,如果您想要执行您所描述的内容,则可以扩展CI_Session
并修改该特定方法,并将其另存为MY_Session
。< / p>
在此处查看更多详情:http://codeigniter.com/user_guide/general/core_classes.html