0

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

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

我知道 IP 不好,因为这可能会在整个浏览会话期间根据用户的本地网络设置而改变。我真的不确定是否X-Forwarded-For可靠,但有些事情告诉我它不可靠。

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

无论如何,我只是希望对此有所了解,希望你们中的一些人对我有所帮助:P

4

1 回答 1

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);
于 2013-04-23T19:54:09.253 回答