Php Codeigniter会话-同一IP地址上的多台相同计算机

Php Codeigniter会话-同一IP地址上的多台相同计算机,php,codeigniter,session,Php,Codeigniter,Session,我在一个场景中运行了一个web应用程序,它是用Codeigniter编写的,并使用了会话库—它是Codeigniter 3.0之前的版本,所以可能是旧的会话库 这个场景是,这个特定的用例在同一个网络上有多台完全相同的笔记本电脑Chromebook相同的外部IP地址将数据与会话数据一起保存到mysql。我如何区分每节课?它们都具有相同的用户代理、相同的IP地址等 这方面的背景是,每个用户帐户都绑定到一个会话,当保存数据时,一些用户与其他用户的会话重叠,从而创建关于用户保存了什么数据的不准确数据 是

我在一个场景中运行了一个web应用程序,它是用Codeigniter编写的,并使用了会话库—它是Codeigniter 3.0之前的版本,所以可能是旧的会话库

这个场景是,这个特定的用例在同一个网络上有多台完全相同的笔记本电脑Chromebook相同的外部IP地址将数据与会话数据一起保存到mysql。我如何区分每节课?它们都具有相同的用户代理、相同的IP地址等

这方面的背景是,每个用户帐户都绑定到一个会话,当保存数据时,一些用户与其他用户的会话重叠,从而创建关于用户保存了什么数据的不准确数据


是否有办法使其更具体,以便准确地检测到正确的用户

这可能是会话冲突的结果,但请记住,会话背后的真正区别因素是sessionID,而不是IP或UA字符串。也就是说,即使两个用户在一个请求中都有相同的远程IP和UA字符串,而他们的浏览器中都没有会话cookie,他们仍然应该被分配一个随机生成的希望是唯一的sessionID,从而仍然可以区分他们的会话

如果您使用CI将会话存储在DB中,则可以执行一个简单的测试来检测是否确实发生了会话冲突。在创建会话的会话驱动程序中,检查用于存储现有会话ID条会话的DB表,该会话ID条与驱动程序新生成的会话ID相匹配,并记录匹配的ID

至少通过这种方式,你可以知道它是否真的在发生,发生的频率有多高

会话冲突的一些根本原因是PHP在PHP5.4中默认使用/dev/uradom的熵源不足,但CI可能会做一些不同的事情;使用高冲突率散列(如md5)尝试sha256或更好;或者只是有太多并发工作线程使服务器过载,例如,尝试降低php fpm或apache prefork max子项设置


需要注意的是,PHP通常不会试图阻止会话冲突。这主要是因为在运行时进行这样的检查会导致性能损失,并且期望在配置良好的情况下发生冲突的概率相当低,尽管并非不可能。在它自己的会话管理器中,虽然codeigniter做它自己的事情,我也懒得阅读他们的文档来找出他们做错了什么。老实说。

即使两个人拥有相同的IP和UA字符串,会话仍然依赖于为每个用户生成的随机ID。尽管如此,你不应该有会话冲突。我想这会带来一个不同的问题。用户正在保存数据,但保存的数据正在分配给其他用户。只有当10个人并排坐在一起,试图同时做相似的任务时,才会发生这种情况。10个月来,我们每天与300名其他用户一起使用它,没有问题,但以前的用户都有不同的机器。。。如果没有重叠的会议,有什么想法吗?可能是Chromebook特有的东西?如果没有任何硬数据,很难说,但这可能是一个实际的会话冲突问题。会话管理器应该为每个会话生成一个随机ID。如果该随机ID的熵源很差,例如较旧的不受支持的PHP版本或只是一个配置不好的框,则两个用户可能最终使用相同的会话ID。当服务器负载很重且出现许多并发请求时,这尤其可能。但是,不要让CodeIgniter将会话绑定到IP/UA的荒谬概念迷惑您。这完全没用。就像CI中的许多东西一样;-谢谢你的洞察力。这很有帮助。谢谢你的洞察力。我找到了一种解决方法,通过在数据初始化事件中传递创建者的会话信息,而不是在数据保存事件中检测会话信息。这也许不太理想,但它很快就解决了问题。嗨,你能澄清一下吗?我也有同样的想法,真的很晦涩!