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

2022-08-30 19:05:40

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

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

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

在 URL 处设置了与跨站点资源关联的 Cookie,但没有该属性。它已被阻止,因为Chrome现在只提供带有跨站点请求的cookie,如果它们设置为和。您可以在开发人员工具中的“应用程序>存储> Cookie”下查看 Cookie,并在 URL 和 URL 中查看更多详细信息。SameSiteSameSite=NoneSecure

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


答案 1

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

ini_set('session.cookie_samesite', 'None');
session_start();

session_set_cookie_params还可以设置它:

session_set_cookie_params(['samesite' => 'None']);
session_start();

php.ini中支持此功能的错误报告在这里


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


答案 2

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

php 7.4 同一站点 in phpinfoenter image description here

php 7.2 同一站点在 phpinfo 中不存在enter image description here

$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();

推荐