PHP 包含 samesite 参数的 setcookie 函数不起作用
PHP setcookie function including samesite parameter does not work
我有一个完全可用的 setcookie()
php 函数 运行 使用这些参数...
<?php
setcookie(
'_siteauth',
Crypt::encrypt(site()->password),
time() + 86400,
'/',
);
?>
上面的代码每次都设置一个 cookie,没有问题!
但是一旦我尝试使用 samesite
选项,cookie 就永远不会设置...这是一个问题。
我不是 运行 iFrame 中的这个。我正在使用 dockers wordpress 图像在本地对此进行测试,我看不出这是一个问题。
一开始网上看了很多,还以为是PHP版本冲突,结果在7.3.0pre/postPHP两个版本都测试不了。
看完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'
]
);
?>
并且 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
,在代码片段中 omitted/set 为 false。
setcookie(
'_siteauth',
Crypt::encrypt(site()->password),
[
'expires' => time() + 86400,
'path' => '/',
'domain' => $_SERVER['HTTP_HOST'],
'samesite' => 'None',
'secure' => true,
]
);
我有一个完全可用的 setcookie()
php 函数 运行 使用这些参数...
<?php
setcookie(
'_siteauth',
Crypt::encrypt(site()->password),
time() + 86400,
'/',
);
?>
上面的代码每次都设置一个 cookie,没有问题!
但是一旦我尝试使用 samesite
选项,cookie 就永远不会设置...这是一个问题。
我不是 运行 iFrame 中的这个。我正在使用 dockers wordpress 图像在本地对此进行测试,我看不出这是一个问题。
一开始网上看了很多,还以为是PHP版本冲突,结果在7.3.0pre/postPHP两个版本都测试不了。
看完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'
]
);
?>
并且 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
,在代码片段中 omitted/set 为 false。
setcookie(
'_siteauth',
Crypt::encrypt(site()->password),
[
'expires' => time() + 86400,
'path' => '/',
'domain' => $_SERVER['HTTP_HOST'],
'samesite' => 'None',
'secure' => true,
]
);