Codeigniter安全问题 - 永远持续的会话?

时间:2012-08-05 14:01:28

标签: php security codeigniter session

在检查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就足够了。

你怎么看?我错过了一些重要的东西吗?或者这是否真的像它出现的安全漏洞一样糟糕?

1 个答案:

答案 0 :(得分:1)

我认为你从评论中得到了重点,但只是发布一个答案,你发现的是正确的功能。

会话是“扩展”的,它们不是从最初的固定时间点创建到+ 7200秒。如果你是一个正在做某事的人,而且在你活跃的时候突然间,你会有点傻。

作为替代方法,如果您想要执行您所描述的内容,则可以扩展CI_Session并修改该特定方法,并将其另存为MY_Session。< / p>

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