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

时间:2015-11-04 22:56:14

标签: php codeigniter session

我正在使用在Codeigniter中编写的网络应用程序并使用会话库(它的3.0之前的Codeigniter,因此它可能是较旧的会话)图书馆)。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

如果您使用CI在数据库中存储会话,则可以执行一项简单的测试来检测是否发生了会话冲突。在创建会话的会话驱动程序中,检查您用于存储现有会话ID(条形码匹配IP / UA)的会话的DB表与驱动程序新生成的会话ID以及log匹配ID。

至少通过这种方式,您可以了解是否实际发生以及发生的频率。

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

重要的是要注意PHP通常不会尝试阻止会话冲突。这主要是因为在运行时进行的这种检查将是性能成本,并且期望发生冲突的概率相当低且具有良好的配置(尽管不是不可能)。 PHP has tons of settings for fine-tuning this在它自己的会话管理器中,虽然codeigniter自己做的事情(我不会费心去阅读他们的文档来弄清楚他们做错了什么是诚实的。)