设置 cookie 过期时间:"time()-3600",总是正确的吗?

Is setting cookie expiration time: "time()-3600", always correct?

删除 PHP 中的 cookie:

我在互联网上阅读,也在我的课程幻灯片上阅读, 如果我们将过期日期设置为 "time()-3600",我们将无法确定 cookie 是否会被客户端删除,

因为客户端时间和服务器时间可能不同。

我同意最后的说法,但是如果 "time()" 函数 return 纪元值,为什么客户端可能不会删除 cookie? 不是绝对值吗?

我认为如果我们设置 time()-3600,响应头 set-cookie 将过期日期作为绝对值,浏览器可以解释该值以查找数据(作为客户端本地数据),当 cookie已过期。

我做错了吗?

客户的时钟可能与实际时间有明显偏差。在那种情况下 time() 是否绝对无关紧要,如果客户端机器有错误的时间,它可能会解释错误的绝对时间,并认为过期时间还在未来。

  • time() returns 自 1970 年 1 月 1 日午夜 UTC 以来的秒数,根据您服务器的时钟
  • setcookie 然后会将其格式化为 the string format required by HTTP,它始终以 GMT 表示。
  • 然后客户端(浏览器)将解析该日期字符串,并将其与 GMT 根据自己的时钟 .
  • 的当前时间进行比较

因此,正确配置的服务器和客户端应该同意 time() - 3600 生成的值是过去的,因此 cookie 将被删除。

但是,这可能会出错的原因有很多:

  • 服务器时钟提前了一个多小时。
  • 服务器时区配置错误,导致time()无法正确调整本地时间为UTC时间。
  • 客户的时钟慢了一个多小时。
  • 客户端的时区配置错误,导致与GMT的对比不正确

还值得注意的是,通常您不能保证客户会任何您想要的。如果您出于安全原因想要使会话无效,您必须在服务器上使它无效,并且删除 cookie 只是为了方便。