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

...它表示可以将选项设置为关联数组,包括expirespathdomainsecurehttponlysamesite,但每次我尝试这个 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,
    ]
);