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

时间:2019-12-30 18:05:24

标签: php session cookies session-cookies php-7.3

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

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

但是,根据Chrome控制台,需要将其设置为“无”:

  

设置了与URL上的跨站点资源关联的cookie,但未设置SameSite属性。它已被阻止,因为Chrome现在仅在跨站点请求中将Cookie设置为SameSite=NoneSecure时才发送。您可以在Application> Storage> Cookies下的开发人员工具中查看Cookie,并在URL和URL上查看更多详细信息。

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

6 个答案:

答案 0 :(得分: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支持的此错误报告为here

答案 1 :(得分:1)

坏:

session.cookie_samesite=None

正确:

session.cookie_samesite="None"

说明here

答案 2 :(得分:1)

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

phpinfo中的php 7.4 samesite enter image description here

php 7.2 samesite在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();

موفقباشید

答案 3 :(得分:0)

此方法对您很有帮助

nginx + Secure下方的SameSite=None上添加标头的属性

位置/ {

proxy_cookie_path /“ /;安全; SameSite = none”;

}

对我有用!

答案 4 :(得分:0)

我正在使用cakephp 1.3。我需要不是同一域的前端后端cookie。 在这里详细检查。

https://stackoverflow.com/a/63481019/6128573

答案 5 :(得分:0)

对于PHP 5.6.40,存在不涉及重建PHP的变通办法(关于path参数的修改)。

如果重建PHP二进制文件没有问题,我设法将此功能从PHP 7.3移植到PHP 5.6.40,现在有一个拉取请求。 对于尚未迁移的项目,我需要它。 我知道5.6分支已弃用,我只是在共享。

拉取请求: https://github.com/php/php-src/pull/6446

我们的回购包含以下更改: https://github.com/Inducido/php-src/tree/PHP-5.6.40

在Debian 8.11上进行了构建测试

新功能

会话: 。为setcookie()增加了对SameSite cookie伪指令的支持, setrawcookie()和session_set_cookie_params()。 从PHP 7.x分支移植 它们的末尾都有一个“ samesite” additional参数(字符串)

原型:

bool setcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]]]])
bool setrawcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]]]])
void session_set_cookie_params(int lifetime [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]])
(session_get_cookie_params updated too)

更改为INI文件处理

  • session.cookie_samesite 。新的INI选项允许为cookie设置SameSite指令。默认值 为“”(空字符串),因此未设置SameSite指令。可以设置为“宽松” 或“ Strict”或“ None”来设置各自的SameSite指令。 使用“无”时,请确保包含引号,因为会解释none 就像ini文件中的false

这解决了Chrome中的“此Set-Cookie由于用户首选项而被阻止”的问题。