我有一个设置cookie的功能;在这个函数中,我使用PHP的setcookie
函数来设置cookie,例如:
setcookie('auth', $token, time() + 3600);
我使用setcookie
的功能如下:
function SetAuthenticationCookie($id, $rememberme) {
$token = md5(uniqid(mt_rand(), true));
executeNonUserQuery([db query]);
if ($rememberme) {
setcookie('auth', $token, time() + (86400 * 90));
setcookie('profid', $id, time() + (86400 * 90));
}
else
{
setcookie('auth', $token, time() + 3600);
setcookie('profid', $id, time() + 3600);
}
}
上述cookie应该有效一小时,并以这种方式出现在浏览器中(见下面的截图)。
在浏览器中,cookie在重定向之前显示(页面是动态的),因此cookie 是被设置。但是,当页面重定向时,它们会消失。这会导致问题,因为主UI页面(登录页面重定向的位置)会检查是否存在身份验证Cookie,如果它们不存在则会重定向回登录页面。
我跟着official documentation for setcookie
,我无法看到问题所在。 Chrome报告Cookie路径为/internal
,因此实际页面可能无法访问它们(页面路径为/pages
),但这仍然没有解释为什么它们会完全从Chrome中消失。
Cookie设置为在设置后的一小时内过期,但这并不能解释Cookie的消失,除非我在setcookie
中遗漏了关于设置到期时间。我在其他浏览器中遇到同样的问题,所以它必须是我做错了或错过的。
我确认我没有任何遗漏或过期的cookie(我还没有实现)。我已尝试设置/
的路径,但这并不能解决问题。
我做错了什么,我该如何解决?
我很清楚这里的安全问题,我的首要任务是先解决这个问题。
答案 0 :(得分:2)
好的,添加路径并将其提供给整个网站,而不仅仅是第一个脚本所在的文件夹
setcookie('auth', $token, time() + 3600, '/');
答案 1 :(得分:2)
此问题是由两个因素引起的:
如问题所述,我已尝试将Cookie路径设置为/
,但效果不佳。但是我没有考虑PHP的时区,它被设置为UTC。
将时区设置为正确的Europe/Guernsey
,并将Cookie路径设置为/
(root)修复了此问题。