通过包含user-agent的哈希保护PHP会话不再适用于IE10


Securing PHP sessions via hash which incorporates user-agent no longer works for IE10

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

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

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

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

无论如何,我只是希望对这个问题有一些深入的了解,希望你们中的一些人能给我一些帮助:p

我只是看了看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);