我有一个使用这些参数运行的完全可用的 setcookie()
php 函数...
<?php
setcookie(
'_siteauth',
Crypt::encrypt(site()->password),
time() + 86400,
'/',
);
?>
上面的代码每次都设置一个 cookie,没有问题!
但是一旦我尝试使用 samesite
选项,cookie 就永远不会设置...这是一个问题。
我没有在 iFrame 中运行它。我正在使用 dockers wordpress 图像在本地对此进行测试,我看不出这是一个问题。
一开始在网上看了很多之后,我认为这可能是 PHP 版本冲突,但是在 PHP 7.3.0 之前/之后的测试中都没有成功。
看完https://www.php.net/manual/en/function.setcookie.php
...它表示可以将选项设置为关联数组,包括expires
、path
、domain
、secure
、httponly
和 samesite
,但每次我尝试此 php setcookie 方法时,它都没有设置。
这是我在本地转储的 $_SERVER['HTTP_HOST']
结果...
demo.local.mydomain.com
以下是我所有的本地测试代码尝试,使用 $_SERVER['HTTP_HOST']
作为域...
<?php
setcookie(
'_siteauth',
Crypt::encrypt(site()->password),
[
'expires' => time() + 86400,
'path' => '/',
'domain' => $_SERVER['HTTP_HOST'],
'samesite' => 'None',
'secure' => false,
'httponly' => false
]
);
?>
<?php
setcookie(
'_siteauth',
Crypt::encrypt(site()->password),
time() + 86400,
'/; SameSite=none'
);
?>
<?php
setcookie(
'_siteauth',
Crypt::encrypt(site()->password),
[
'expires' => time() + 86400,
'path' => '/',
'domain' => $_SERVER['HTTP_HOST'],
'secure' => false,
'httponly' => false,
'samesite' => 'None'
]
);
?>
并且这些代码示例在执行时都没有保存 _siteauth
cookie。
我已经尝试了 php 版本 setcookie()
的所有变体,包括 samesite
键和值,但没有保存任何 cookie。
我更改之前的 setcookie()
脚本的原因是 2020 年初 chrome 中的 iframe cookie 策略发生了变化,默认为 samesite Lax
。所以我需要在设置 cookie 时强制 samesite None
。
https://web.dev/samesite-cookies-explained/
https://web.dev/samesite-cookie-recipes/
如果有人能看到我哪里出错了,帮助会很棒。
最佳答案
当您使用 SameSite=None
设置 cookie 时,它将被(浏览器)阻止,除非它也具有 Secure
,后者在中被省略/设置为 false代码片段。
setcookie(
'_siteauth',
Crypt::encrypt(site()->password),
[
'expires' => time() + 86400,
'path' => '/',
'domain' => $_SERVER['HTTP_HOST'],
'samesite' => 'None',
'secure' => true,
]
);
关于包含 samesite 参数的 PHP setcookie 函数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69783387/