通过包含用户代理的散列来保护PHP会话不再适用于IE10

通过包含用户代理的散列来保护PHP会话不再适用于IE10,php,session,security,user-agent,Php,Session,Security,User Agent,我在PHP中有一个会话管理类,每次加载会话时都会重新生成安全哈希,以防止会话劫持。最近我遇到了一些抱怨,说IE 10的用户一直在注销。我把这个问题追溯到一个可能的问题,IE10+未知插件导致用户代理从一个页面加载到下一个页面加载略有不同。我没有证据证明这确实发生了,因为我无法复制它,但如果出现这种情况,这会中断会话,因为即使浏览器用户代理字符串中的一个字符更改也会导致生成无效的安全哈希,从而导致注销 我的问题很简单:假设上述是真的,还有什么其他值可以用来代替用户代理。这必须是某种常量字符串,可能

我在PHP中有一个会话管理类,每次加载会话时都会重新生成安全哈希,以防止会话劫持。最近我遇到了一些抱怨,说IE 10的用户一直在注销。我把这个问题追溯到一个可能的问题,IE10+未知插件导致用户代理从一个页面加载到下一个页面加载略有不同。我没有证据证明这确实发生了,因为我无法复制它,但如果出现这种情况,这会中断会话,因为即使浏览器用户代理字符串中的一个字符更改也会导致生成无效的安全哈希,从而导致注销

我的问题很简单:假设上述是真的,还有什么其他值可以用来代替用户代理。这必须是某种常量字符串,可能因用户而异,并且必须由用户提供。起初我打算使用数据库中用户密码的散列版本,但后来我意识到这是不好的,因为它不是由用户提供的,因此在发生劫持企图时将保持“正确”

我知道IP是不好的,因为根据用户的本地网络设置,在整个浏览会话中,IP可能会发生变化。我真的不确定X-Forwarded-For是否可靠,但有些东西告诉我它不可靠

也许最好的解决方案是设置一些更高级别的浏览器检测,然后使用简化的浏览器名称,以便UA字符串中的细微变化不会影响哈希中使用的字符串

无论如何,我只是希望能对此有所了解,希望你们中的一些人能为我做点什么:p

我只是看了一下,然后决定最好只使用此函数中的驱动字符串,这样对用户代理的轻微访问不会中断会话:

// get browser data
$browser = get_browser();

// create security hash
// Other stuff is done here that I omitted from this post for security reasons :)
$_SESSION["security_hash"] = sha1($static_key . $dynamic_key . $browser->platform . $browser->browser . $browser->version);