【问题标题】:php cookie unset + setting cookie to a garbage value followed by js redirect not working to log user out, why?php cookie未设置+将cookie设置为垃圾值,然后js重定向无法注销用户,为什么?
【发布时间】:2015-03-30 14:15:24
【问题描述】:

如果我怀疑有 csrf 攻击(令牌不匹配),我会尝试注销用户。当我遇到以下 else 条件时,我正在对此进行测试:

else
{
            session_destroy();
            unset($_COOKIE['email']);
            unset($_COOKIE['userhash']);
            unset($_COOKIE['name']);

           $crapname = makeTokenCookie("crap", $con);
            setcookie('user', 'garbage', time()+rand(1,100), NULL);
            setcookie('name', 'garbage', time()+rand(1,100), NULL);
            setcookie('userhash', 'garbage', time()+rand(1,100), NULL);
            setcookie('id', 'garbage', time()+60*60*24*30*6, '/', NULL);
            setcookie('email', 'garbage', time()+60*60*24*30*6, '/', NULL);

            alertMe("Your session has timed out. Please login again.");
            echo "<script>document.location.href='index2.php'</script>";
            exit();
}

我让用户使用 cookie 自动登录,这就是我在这里明确取消设置它们的原因。然而,当用户被重定向到 index2.php 时,她已经通过 cookie 登录了。当用户按下注销按钮时,我使用这些相同的代码行,并且效果很好。知道为什么以下代码没有将 cookie 取消设置为某些东西吗?

【问题讨论】:

  • 为什么要将电子邮件地址存储在 cookie 中?另外,为什么是5!饼干?
  • @Jack,我正在学习,所以如果您有其他建议,我会欢迎他们。对于我的网站,电子邮件地址是用户名。然后我使用 userhash,这样人们就不能操纵他们的 cookie 来通过 cookie 登录来访问其他人的帐户。最后,我一直访问 id 和 name 和 user(用户类型)属性,所以我认为我会将它们存储在 cookie 中,而不是为会话变量检索它们。另外我的理解是本地存储不是永久性的,而只能通过会话进行,也许我错了。这些是很小的文本片段,对于 cookie 来说真的太多了吗?
  • 这正是您应该使用会话的目的;只有一个 cookie 可以跟踪
  • @Jack 但如果您只使用一个 cookie,则该 cookie 值可能会被窃取。至少使用一对 cookie,您可以相互交叉检查它们,这甚至比仅 1 个长散列更好。不希望人们摆弄价值观来猜测其他人的价值观,对吗?我的 5 cookie 设置有什么缺点?
  • 如果一个 cookie 可以“被盗”,同样的情况也适用于其中五个,因此这不是拥有更多 cookie 的理由。会话劫持是一个研究课题,所以如果您担心的话,我建议您研究一下对策。

标签: php cookies


【解决方案1】:

unset() 不会删除 cookie。您需要创建一个在过去过期的同名 cookie 才能真正将其删除。在您尝试取消设置后,您还会创建具有未来到期日期的 cookie,这会适得其反。

session_destroy();
$_SESSION = array();
setcookie(session_name(), '', strtotime('-1 year'));
setcookie('user', '', strtotime('-1 year'));
setcookie('name', '', strtotime('-1 year'));
setcookie('userhash', '', strtotime('-1 year'));
setcookie('id', '', strtotime('-1 year'));
setcookie('email', '', strtotime('-1 year'));

alertMe("Your session has timed out. Please login again.");
echo "<script>document.location.href='index2.php'</script>";
exit();

【讨论】:

  • 感谢您的建议,但我来到这个系统是因为 Mozilla 不会取消设置 cookie 或即使在它们过期之后也不会删除它们。这就是为什么我取消设置cookie然后用垃圾填充它们。它通常对我有用。
  • AFAIK 这不是 FF 中的已知错误,因此它可能与您在代码中处理 cookie 的方式有关。
  • 显然你比我知道的多,但是在 Firefox 上将 cookie 设置为过去的时间对我来说从来没有用过。至少截至 2014 年 1 月,我并不是唯一一个:support.mozilla.org/en-US/questions/983361
  • 这是特定于拥有太多 cookie 的用户。这不是由您或我可以编写的任何代码引起的。
  • 好吧,我想我有这个问题,尽管我通常每天都清除缓存。无论如何,如果用户可能有这个问题,似乎安全明智我应该假设他们确实有这个问题,不是吗?否则他们还没有真正退出对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多