【发布时间】: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 的理由。会话劫持是一个研究课题,所以如果您担心的话,我建议您研究一下对策。