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

时间:2013-04-23 19:37:34

标签: php session security user-agent

我在PHP中有一个会话管理类,每次加载会话时都会重新生成安全哈希,以防止会话被劫持。最近我遇到一些投诉,IE 10用户不断登出。我已经将此问题追溯到IE10 +未知插件的可能问题,导致用户代理从一个页面加载到下一个页面加载略有不同。我没有证据证明这实际上正在发生,因为我无法重现它,但是如果情况会破坏会话,因为即使浏览器用户代理字符串中的一个字符发生更改也会导致生成无效的安全性哈希,从而导致会话中断退出。

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

我知道IP很糟糕,因为在整个浏览会话中,这可能会改变用户,具体取决于他们的本地网络设置。我真的不确定X-Forwarded-For是否可靠,但有些东西告诉我它不是。

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

无论如何,我只是希望对此有所了解,希望你们中的一些人能为我找到一些东西:P

1 个答案:

答案 0 :(得分:0)

我刚看了一下PHP get_browser()并决定最好只使用此功能中的来自字符串的字符串,以便用户代理的轻微骚动不会破坏会话:

// 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);