如何安全地销毁cookie和处理时区?

时间:2013-10-01 17:54:38

标签: php cookies

我们删除了我们的Cookie,例如php.net上的建议以及几个SO问题(Remove a cookie):

setcookie('id', '', time() - 3600, "/", "", false, true);

如果我们分析此解决方案,当服务器和浏览器之间的时区差异超过1小时(旅行用户,不同时区,计算机时钟问题,OS时钟问题等)时,它看起来不起作用。

因此,我们计划在过去进一步设定日期:

setcookie('id', '', time() - 86400, "/", "", false, true);

我们已经读过IE浏览器可以跳过过去日期过多的Cookie。

建议使用哪个值?

如果用户在计算机上设置时间有问题(错误设置或时钟电池耗尽),该怎么办? (我们知道它是例外,但这些人总是抱怨我们的网站并提高支持票(这需要花钱)。)

注1:根据Theolodis的建议,我们可以像这样(修改)链接cookie:

setcookie('id', '', time() - 3600,  "/", "", false, true);
setcookie('id', '', time() - 90000, "/", "", false, true); #25 hours
setcookie('id', '', 1,              "/", "", false, true);

是否涵盖所有案例是一个好主意?

注2:我们正在服务器端寻找解决方案(如果可能的话)。

2 个答案:

答案 0 :(得分:1)

我想@Theolodis的解决方案适用于大多数情况,但你仍然会有时区差异或计算机的时钟问题。

所以我想:如果每个用户的计算机中可能设置了不同的时钟/时区,那么最好使用他们的时间作为销毁cookie的默认参数吗?

可悲的是,服务器端脚本无法获取当前用户的时间,但是may workaround it using AJAX。是的,它会给你更多的工作,但我认为几乎完全是防止失败的。

您可以获得用户的时间并将其存储到$_SESSION['time']中,如提供的示例所示。然后你需要做的就是将cookie设置为在“之前”过期一秒(我不计算由AJAX请求引起的时间延迟)。

setcookie('id', '', strtotime($_SESSION['time']) - 1,  "/", "", false, true);

此外,这里有一些关于Internet Explorer Cookie Behaviour的有趣读物。

我不确定这是有史以来最好的解决方案,但我希望它对您有用 - 或者至少可以找到更好的解决方案。

答案 1 :(得分:0)

使用DateTime它可以处理时区。