【问题标题】:PHP, cookies, and rapid browser refreshPHP、cookies 和快速浏览器刷新
【发布时间】: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 您应该在下面发布您的解决方案作为答案,然后当您有机会时。
  • 每次请求页面时都更改令牌?这会以何种方式为流程增加任何价值?

标签: php mysql cookies


【解决方案1】:

您的解决方案并没有增加安全性,反而让您的用户非常头疼。

如果您使用 PHP 会话,您不必依赖多个 cookie,也不必在每次访问时对所有内容进行哈希处理。设置会话将提高安全性,因为您的用户将无法更改其会话变量。 cookie 是用户可修改的,因此您不能盲目信任它们。不过,用户可以更改 PHPSESSION cookie,但是将会话更改为另一个会话的机会非常小,几乎不可能。

使用您当前的代码,如果用户在新选项卡上打开链接,并且在请求返回之前打开另一个链接,他将被注销。 cookie 将在第一次请求时更改,但在浏览器获取新值之前,用户使用旧 cookie 提交另一个请求。新值在数据库上,处理旧值的新请求,会话失效。另一个不开心的用户因为被随机注销而感到困惑。

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 2013-09-11
    • 2015-05-03
    • 2015-07-10
    • 1970-01-01
    • 2012-11-02
    • 2017-02-14
    • 1970-01-01
    • 2014-08-10
    相关资源
    最近更新 更多