对于我的登录系统,我有一个令牌值,每次发生身份验证时都会更改。每次访问任何页面时都会进行身份验证(通过查找令牌cookie和会话广告等),以及每次$.ajax
调用(我的想法是我希望确保用户始终进行身份验证,如果如果身份验证因令牌或系列错误而失败,系统会自动完全注销)。在身份验证过程中,当确定当前会话有效时,会生成一个新令牌,并将该令牌设置为cookie并在MySQL表中更新,如下所示:
$newtoken = hash("sha256", mt_rand());
my_mysqli_query($link,
'UPDATE _rememberme SET token = "'.$newtoken.'", lastupdated = "'.now().'"
WHERE series = "'.$series.'" AND email = "'.$email.'"');
setmycookie("token", $newtoken, 7);
当我快速刷新浏览器时,它最终导致MySQL令牌和cookie令牌不匹配。我认为问题是,在快速刷新期间,MySQL表会更新,但随后会发生刷新,脚本会在更新cookie之前中止。这会导致将来的身份验证失败,因为cookie令牌与MySQL令牌不匹配。
我非常感谢有关如何让用户快速刷新浏览器的一些想法。
我已经研究过这个问题,并且在找到解决方案方面收效甚微。
答案 0 :(得分:1)
您的解决方案不会增加安全性,并为您的用户增添了一个令人头疼的问题。
如果您使用 PHP会话,则不必依赖多个Cookie,也不必在每次访问时对所有内容进行哈希处理。准备会话将提高安全性,因为您的用户将无法更改其会话变量。 Cookie是用户可修改的,因此您无法盲目信任它们。但是,用户可以更改PHPSESSION cookie,但是将会话更改为另一个会话的可能性非常小,几乎不可能。
使用当前代码,如果用户在新选项卡上打开链接,并且在请求返回之前打开另一个链接,他将被注销。 cookie将在第一个请求时更改,但在浏览器获取新值之前,用户会使用旧cookie提交另一个请求。新值在数据库上,处理具有旧值的新请求,并且会话无效。另一个不满意的用户感到困惑,因为他被随机注销了。