【发布时间】:2016-04-01 22:24:55
【问题描述】:
对于我的登录系统,我有一个令牌值,每次进行身份验证时都会更改。每次访问任何页面时都会进行身份验证(通过查找令牌 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 令牌不匹配。
我非常感谢一些关于如何让用户快速刷新浏览器的想法。
我研究过这个问题,但在找到解决方案方面收效甚微。
【问题讨论】:
-
如何验证令牌?
lastupdated时间戳是否以这样的方式参与验证,即同一秒内的两次修改会导致冲突?请同时发布该代码 - 刷新似乎不太可能发生得足够快以停止UPDATE语句和setcookie()调用之间的执行,并且更可能与验证逻辑有关。 -
不,不涉及 lastuppdated。它更多地只是为了提供信息。我现在不在家使用我的代码,但基本上,我不必要地根据 cookie 分配会话 ID,然后是 session_start(),然后是 regenerate_session_id()。通过选择删除 ID 分配和重新生成,问题就消失了。我知道这不是最好的解决方案,而且该网站不会上线很长时间,所以我还有时间研究。
-
先生,您确定您没有将令牌切割成特定的长度吗?或者,您的数据库可能设置为只接受令牌的一部分,而削减其余部分。请同时发布一些输出
-
@mrphuzz 您应该在下面发布您的解决方案作为答案,然后当您有机会时。
-
每次请求页面时都更改令牌?这会以何种方式为流程增加任何价值?