Php Codeigniter安全问题-持续时间长的会话?

Php Codeigniter安全问题-持续时间长的会话?,php,security,codeigniter,session,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); $expire=$this->now-$this->sess\

在检查CodeIgniter的会话处理机制时,我发现了一些我认为非常值得关注的问题

$expire = $this->now - $this->sess_expiration;

$this->CI->db->where("last_activity < {$expire}");
$this->CI->db->delete($this->sess_table_name);
$expire=$this->now-$this->sess\u expire;
$this->CI->db->where(“上次活动<{$expire}”);
$this->CI->db->delete($this->sess\u table\u name);
看起来CI实际上是基于最后一个活动而不是固定的、非可变的过期字段来确定会话过期时间的

这里的问题是,每次更新会话时,最后一个_活动都会更新为now()。因此,假设您使用的是CI默认值,会话持续7200秒(2小时),每300秒(5分钟)更新一次

会话在上次更新的5分钟后标记为需要更新,因此,如果用户在这5分钟后但在2小时之前提交其会话cookie,则CI将从此时起将会话延长到另一个2小时,因为上次_活动将更新到现在()

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

想象一下,如果攻击者窃取您的登录cookie并建立有效会话。即使您使登录cookie无效,攻击者也可以使其会话无限期有效,只要他不断提交cookie的次数足够多


你觉得怎么样?我是不是错过了什么重要的东西?或者这真的是一个看起来那么糟糕的安全漏洞吗

我想你从评论中得到了要点,但是简单地发布一个答案,你发现的是正确的功能

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

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


请参阅此处的更多详细信息:

我认为网站通常都是这样工作的。如果您希望某个会话在登录两小时后过期,即使该会话在该会话期间经常使用,那么(a)这是一个异常高的安全要求,(b)您可能需要自己的会话处理程序。这不是一个安全漏洞。这是PHP会话在默认情况下的工作方式,在决定是否使会话文件过期之前查看会话文件的修改时间。会话超时用于使非活动会话过期。你不希望你的客户每两个小时就必须重新登录一次,因为这非常烦人,而且可能会破坏他们在你的网站上所做的一切,因为他们在登录后的两个小时就已经过去了。由于某种原因,我从未在任何地方看到过这些信息。谢谢大家的输入。关于“如果您使登录cookie无效”。获取会话(可能包含成员id)后,您可以/应该检查用户凭据是否仍然有效,如果无效,则销毁会话。