如何告诉 PHP 对跨站点 cookie 使用 SameSite=None?

Dan*_*ous 21 php cookies session session-cookies php-7.3

据这里的文章https://php.watch/articles/PHP-Samesite-cookies和PHP documenation在https://www.php.net/manual/en/session.security.ini.php,只有2 PHP 7.3 中添加的此新功能的可能配置选项:

  1. session.cookie_samesite=松懈
  2. session.cookie_samesite=严格

然而,根据 Chrome 控制台,这需要设置为“无”:

与 URL 上的跨站点资源关联的 cookie 设置为没有该SameSite属性。它已被阻止,因为 Chrome 现在仅在设置了SameSite=None和 的情况下才提供具有跨站点请求的 cookie Secure。您可以在应用程序>存储>Cookies 下的开发人员工具中查看 cookie,并在 URL 和 URL 中查看更多详细信息。

因此,我无法再设置跨站点 cookie。解决方法是什么?

Ano*_*ous 30

您可以使用 将值设置为“无” ini_set。使用该函数时,不会检查该值是否受支持:

ini_set('session.cookie_samesite', 'None');
session_start();
Run Code Online (Sandbox Code Playgroud)

session_set_cookie_params 也可以设置:

session_set_cookie_params(['samesite' => 'None']);
session_start();
Run Code Online (Sandbox Code Playgroud)

php.ini 支持的错误报告在这里


正如@shrimpwagon下面评论中所说的那样session.cookie_secure必须是true这样才能起作用。PHP 不需要它,但浏览器需要。

  • 谢谢 - 我能够使用以下代码来摆脱 Chrome 消息并允许跨站点 cookie 继续工作: session_set_cookie_params(['samesite' => 'None', 'secure' => true]); (6认同)
  • 有点不正确。需要是: `session_set_cookie_params(['SameSite' => 'None', 'Secure' => true]);` (4认同)
  • 请注意,旧浏览器不支持 Samesite=none,并且会完全拒绝 Cookie。检查此项并确保在为会话 cookie 设置 SameSite 属性时排除旧浏览器:https://www.chromium.org/updates/same-site/inknown-clients (2认同)

小智 9

ini_set('session.cookie_secure', "1"); ini_set('session.cookie_httponly', "1"); ini_set('session.cookie_samesite','None'); session_start();

phpinfo 中的 php 7.4 相同站点 在此输入图像描述

phpinfo 中不存在 php 7.2 Samesite 在此输入图像描述

$currentCookieParams = session_get_cookie_params();
$cookie_domain= 'your domain';
if (PHP_VERSION_ID >= 70300) {
session_set_cookie_params([
    'lifetime' =>  $currentCookieParams["lifetime"],
    'path' => '/',
    'domain' => $cookie_domain,
    'secure' => "1",
    'httponly' => "1",
    'samesite' => 'None',
]);
} else {
session_set_cookie_params(
    $currentCookieParams["lifetime"],
    '/; samesite=None',
    $cookie_domain,
    "1",
    "1"
);
}
session_start();
Run Code Online (Sandbox Code Playgroud)