【问题标题】:How to tell PHP to use SameSite=None for cross-site cookies?如何告诉 PHP 对跨站点 cookie 使用 SameSite=None?
【发布时间】:2020-04-19 10:41:43
【问题描述】:

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

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

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

在没有SameSite 属性的情况下设置了与 URL 处的跨站点资源关联的 cookie。它已被阻止,因为 Chrome 现在仅在使用 SameSite=NoneSecure 设置时才提供带有跨站点请求的 cookie。您可以在 Application>Storage>Cookies 下的开发者工具中查看 cookie,并在 URL 和 URL 中查看更多详细信息。

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

【问题讨论】:

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


【解决方案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


正如@shrimpwagoncomment below 中所说,session.cookie_secure 必须是true 才能正常工作。 PHP 不需要,但浏览器需要。

【讨论】:

  • 谢谢 - 我能够使用以下代码摆脱 Chrome 消息并允许跨站点 cookie 继续工作: session_set_cookie_params(['samesite' => 'None', 'secure ' => true]);
  • 注意,samesite=none 在旧浏览器中不受支持,并且会完全拒绝 cookie。检查此项并确保在为会话 cookie 设置 samesite 属性时排除旧浏览器:chromium.org/updates/same-site/incompatible-clients
  • 在 php.ini 中设置 session.cookie_samesite=None 在 PHP 7.3.15 中不起作用。如上所述使用 session_set_cookie_params 确实有效。
  • 有点不正确。需要是:session_set_cookie_params(['SameSite' => 'None', 'Secure' => true]);
  • @shrimpwagon 更新
【解决方案2】:

这个方法对你有帮助

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

位置/{

proxy_cookie_path / "/;secure; SameSite=none";

}

它对我有用!

【讨论】:

    【解决方案3】:

    不好:

    session.cookie_samesite=None
    

    正确:

    session.cookie_samesite="None"
    

    解释here

    【讨论】:

    • 不要这样做。一些浏览器存在漏洞,并且会在 SameSite=None 的情况下完全拒绝 cookie。您需要先嗅探 UserAgent。 Here is an explanation from Google.
    【解决方案4】:

    我正在使用 cakephp 1.3。我需要在不同域的前端后端 cookie。 在此处查看详细信息。

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

    【讨论】:

      【解决方案5】:

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

      phpinfo 中的 php 7.4 相同站点 enter image description here

      phpinfo 中不存在 php 7.2 samesite 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();
      

      موفق باشید

      【讨论】:

        【解决方案6】:

        对于 PHP 5.6.40,存在一个不涉及重建 PHP 的解决方法(hack on 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 分支的端口 它们在最后都有一个“相同的”附加参数(字符串)

        原型:

        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 .允许为 cookie 设置 SameSite 指令的新 INI 选项。默认值 到“”(空字符串),所以没有设置 SameSite 指令。可以设置为“宽松” 或“Strict”或“None”,它们设置各自的 SameSite 指令。 使用“无”时,请确保包含引号,因为 none 被解释为 比如 ini 文件中的false

        这解决了 Chrome 中“此 Set-Cookie 因用户偏好而被阻止”的问题。

        【讨论】:

          猜你喜欢
          • 2020-02-10
          • 2020-03-11
          • 2021-07-22
          • 2020-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-02
          相关资源
          最近更新 更多