【问题标题】:PHP - correctly set cookie parameters (expire) using header() - not set-cookie()PHP - 使用 header() 正确设置 cookie 参数(过期) - 不是 set-cookie()
【发布时间】:2021-01-29 18:56:38
【问题描述】:

我们正在使用的网站正在运行较旧的 HHVM 版本。 看PHP函数setcookie()的文档,参数有两个签名。

总结我不能使用setcookie()的问题是因为这个版本没有使用PHP7.3可用的$options数组。当尝试通过将 samesite 连接到 path 来使用某些替代解决方案时,将会崩溃 HHVM。使用这种替代方法使用普通 PHP 可以正常工作。

与 PHP 相比,此处使用 cookie 的 HHVM 行为似乎略有不同

所以这个问题是关于 header() 而不是关于 setcookie() 因为我不能使用它,HHVM(运行的版本)略有不同) 处理 cookie。

注意:这是一个 Magento 1 站点 --- 升级到 HHVM 3.30+ 会破坏一切,所以这也不是一个选择 - 我已经尝试过了

所以我设法通过连接所有属性使用header() 函数设置cookie。

header('Set-Cookie: frontend=abcdef; expires=188888888; path=/; domain=www.mydomain.com; SameSite=None; Secure');

响应标头中的结果:

frontend=abcdef; expires=188888888; path=/; domain=www.mydomain.com; Secure; SameSite=None

Set-Cookie 文档指的是这个:

您可能会注意到 expires 参数采用 Unix 时间戳,而不是日期格式 Wdy、DD-Mon-YYYY HH:MM:SS GMT,这是因为 PHP 在内部进行此转换。

问题

  • 如何正确设置 expires 值,因为我正在创建一个 raw 标头而不是使用setcookie(),UNIX 时间戳将在 cookie 中,如上所示,换句话说,setcookie() 在内部转换 UNIX 时间戳...

  • 我也尝试了以下方法 - 但我不确定这对于 expires 是否正确:需要什么格式?

示例:

php -a

php > $b = 3600 * 24 * 365;
php > $c = time() + $b;
php > echo $c;
1643355613
php > $dt = new DateTime();
php > $dt->setTimestamp($c);
php > echo $dt->format('Y-m-d H-i-s');
2022-01-28 09-40-13

不完全确定 expires 会正确使用该格式

这个问题与会话在某些情况下不起作用的问题有关,但我会将这些问题分开讨论。

【问题讨论】:

  • “需要什么格式?” - 你是不是直接引用了 setcookie 手册中的内容……?
  • 也许应该澄清一下问题,允许哪些格式,哪些不允许......以及如何正确设置它们。
  • 谢谢,这在/Date url 中清除了它:“格林威治标准时间。HTTP 日期始终以格林威治标准时间表示,而不是本地时间”。我将研究如何在 PHP 中将 DateTime 转换为 GMT 时区
  • 请注意,HHVM 3.30 一年多前 hhvm.com/blog/2018/12/17/hhvm-3.30.html 失去了支持,听起来您使用的版本比这更早!您正在运行的 HHVM 版本存在多个未修补的安全漏洞。你真的真的应该升级到 PHP 7 的现代版本(因为 HHVM 不再支持像 Magento 这样的原生 PHP 代码)。运行此类过时的软件会使您的客户面临风险!

标签: php magento cookies header hhvm


【解决方案1】:

这是回答如何使用header()函数创建原始的set-cookie

因为setcookie()会自动将时间戳变成格式化字符串,所以这个转换必须自己完成。

Mozilla Set-Cookie 是这样说的:

作为 HTTP 日期时间戳的 cookie 的最长生命周期。有关所需格式,请参阅日期。

Mozilla Headers Date format 显示所需的格式:

  Date: Wed, 21 Oct 2015 07:28:00 GMT

使用header() functionset-cookie 创建格式正确的日期字符串:

// Assume current time + one day
$expires = time() + 60 * 60 * 24;
$dateTime = new DateTime();

// Set the timestamp
$dateTime->setTimestamp($expires);
// Set the timezone using a new DateTimeZone instance
$dateTime->setTimezone(new DateTimeZone('GMT'));
// Print the format.
// This format based on PHP DateTime formats - the 'e' switch adds the time zone at the end.
$format = 'D, d M Y H:i:s e';
$expiresText = $dateTime->format($format);

// Set the raw header with expires text (encode if needed)
header("Set-Cookie: cookieName=cookieValue; expires=$expiresText; samesite=None; Secure");

这应该会给出一个set-cookie,它的日期格式是根据需要进行的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多