代码点火器会话-同一IP地址上的多台相同计算机


Codeigniter sessions - multiple identical computers on same IP address

我正在运行一个使用Codeigniter编写的web应用程序的场景,该应用程序使用会话库(它是Codeigniters 3.0之前的版本,所以可能是旧的会话库)。

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

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

有没有办法让它更具体,以便准确地检测到正确的用户?

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

如果您使用CI将会话存储在数据库中,那么可以进行一个简单的测试来检测是否确实发生了会话冲突。在创建会话的会话驱动程序中,对照驱动程序新生成的会话ID和log匹配ID,检查用于存储现有会话ID(条匹配IP/UA)会话的DB表。

至少这样,你就会知道它是否真的发生了,以及发生的频率有多高。


会话冲突的一些根本原因是较差的熵源(从PHP 5.4开始,PHP默认使用/dev/urandom,但CI可能会做一些不同的事情);使用像md5这样的高冲突率散列(请尝试sha256或更好的散列);或者只是有太多并发工作程序使服务器过载(例如,尝试降低php-fpm或apacheprefork max children设置)。

需要注意的是,PHP通常不会固有地试图防止会话冲突。这主要是因为在运行时进行这样的检查将是一种性能成本,并且期望在配置良好的情况下发生冲突的概率相当低(尽管并非不可能)。PHP在自己的会话管理器中有大量的设置来微调这一点,尽管codeigniter做自己的事情(老实说,我不愿意阅读他们的文档来找出他们做错了什么)。