【问题标题】:How to fix "set SameSite cookie to none" warning?如何修复“将 SameSite cookie 设置为无”警告?
【发布时间】:2020-01-31 04:04:10
【问题描述】:

我创建了一个 chrome 扩展,并从 popup.js 我调用了读取 cookie 的 PHP 脚本(使用 Xhttprequest)。像这样:

$cookie_name = "mycookie";

if(isset($_COOKIE[$cookie_name]))
{
    echo $_COOKIE[$cookie_name];
}
else{
    echo "nocookie";
}

但我在扩展程序错误时收到此警告。

与(这是我的域)的跨站点资源关联的 cookie 设置为没有 SameSite 属性。未来版本的 Chrome 将仅通过设置为 SameSite=NoneSecure 的跨站点请求传递 cookie。您可以在开发人员工具中的 Application>Storage>Cookies 下查看 cookie,并在 https://www.chromestatus.com/feature/5088147346030592https://www.chromestatus.com/feature/5633521622188032 查看更多详细信息。

我尝试创建一个这样的 cookie,但没有帮助。

setcookie($cookie_name,$cookie_value, time() + 3600*24, "/;samesite=None ","mydomain.com", 1);

遵循this question 的说明。

【问题讨论】:

  • 我猜它还说“安全”,意思是 https。
  • 你可以按照这个例子来解决这个问题:stackoverflow.com/a/58723552/6215447
  • 您可以在 PHP 5.4+ 上使用 a third-party library 管理 cookie,提供一个带有附加参数 $sameSitesetcookie 替换。参数可以是NoneLaxStrict。 OOP 接口也可用。

标签: php cookies


【解决方案1】:

我也在为此“反复试验”,但来自 Google Chrome Labs 的 Github 的这个答案对我有所帮助。我将它定义到我的主文件中并且它工作 - 很好,只适用于一个第三方域。仍在进行测试,但我渴望用更好的解决方案更新这个答案:)

编辑:我现在使用的是 PHP 7.4,这种语法运行良好(2020 年 9 月):

$cookie_options = array(
  'expires' => time() + 60*60*24*30,
  'path' => '/',
  'domain' => '.domain.com', // leading dot for compatibility or use subdomain
  'secure' => true, // or false
  'httponly' => false, // or false
  'samesite' => 'None' // None || Lax || Strict
);

setcookie('cors-cookie', 'my-site-cookie', $cookie_options);

如果您有 PHP 7.2 或更低版本(如下 Robert 的回答):

setcookie('key', 'value', time()+(7*24*3600), "/; SameSite=None; Secure");

如果您的主机已经更新到 PHP 7.3,您可以使用(感谢 Mahn 的评论):

setcookie('cookieName', 'cookieValue', [
  'expires' => time()+(7*24*3600,
  'path' => '/',
  'domain' => 'domain.com',
  'samesite' => 'None',
  'secure' => true,
  'httponly' => true
]);

您可以尝试检查 cookie 的另一件事是启用下面的标志,用他们自己的话来说,它“将为可能受此更改影响的每个 cookie 添加控制台警告消息”:

chrome://flags/#cookie-deprecation-messages

查看完整代码:https://github.com/GoogleChromeLabs/samesite-examples/blob/master/php.md,他们也有 same-site-cookies 的代码。

【讨论】:

  • 我正在使用 PHP 7.3 并 ried (header 和 setcookie) 但是当我使用 PayPal 脚本加载页面时仍然收到 SameSite 警告...虽然我仍在本地主机上,确实有什么区别吗?
  • @LuBre 嗯可能是。我还没有像这样进行测试,但很有意义。另外,你的本地主机有 SSL 吗?
  • 遗憾的是 int 不是 localhost 问题,我也在网上遇到了这个警告。我会说这是Paypal方面的事情......
  • 嗯嗯...我认为@vir us 下面的评论适合您的问题,可能 PayPal 还不太关心它:P
  • 正确的 7.3 setcookie 语法示例,因为答案中的示例弄乱了参数:setcookie('key', 'value', ['expires' => time()+(7*24*3600, 'path' => '/', 'domain' => 'yourdomain.com', 'samesite' => 'None', 'secure' => true, 'httponly' => true ]);
【解决方案2】:

随着新功能的推出,SameSite=None cookie 也必须标记为Secure,否则将被拒绝。

您可以在chromium updates 和此blog post 上找到有关更改的更多信息

注意:与问题不太直接相关,但可能对登陆这里的其他人有用,因为在我的网站开发过程中,这是我最初关心的问题:

如果您看到列出一些 3rd 方网站的问题的警告(在我的情况下是 google.com,嗯) - 这意味着 他们 需要修复它,这与您的网站。当然,除非警告提到您的网站,在这种情况下添加 Secure 应该可以修复它。

【讨论】:

  • 谢谢你,我无法理解为什么我的 cookie 没有被设置。
  • 该死的。我花了一整天的时间试图弄清楚为什么 samesite 在我们的 Symfony 项目中不起作用。原来我也需要将安全 cookie 属性设置为 true。谢谢!
【解决方案3】:
>= PHP 7.3

setcookie('key', 'value', ['samesite' => 'None', 'secure' => true]);

< PHP 7.3

exploit the path
setcookie('key', 'value', time()+(7*24*3600), "/; SameSite=None; Secure");

Emitting javascript

echo "<script>document.cookie('key=value; SameSite=None; Secure');</script>";

【讨论】:

  • 添加一条关于你的答案的描述信息
  • 好的,这是此页面上唯一有效且正在生产中的答案:D
  • 从文档中,数组键应该是小写的:link
  • 这在 php 5 和 joomla 和 chrome 中对我有用!
【解决方案4】:

我最终通过安装 mod_headers 为 Chrome 80 修复了 Ubuntu 18.04 / Apache 2.4.29 / PHP 7.2 安装:

a2enmod headers

将以下指令添加到我们的 Apache VirtualHost 配置中:

Header edit Set-Cookie ^(.*)$ "$1; Secure; SameSite=None"

然后重启 Apache:

service apache2 restart

在查看文档 (http://www.balkangreenfoundation.org/manual/en/mod/mod_headers.html) 时,我注意到“始终”条件在某些情况下无法从同一个响应标头池中工作。因此,不使用“always”对我来说对 PHP 有用,但文档建议如果你想覆盖所有基础,你可以添加带有和不带有“always”的指令。我没有测试过。

【讨论】:

    【解决方案5】:

    如果您在使用 JavaScript 设置 cookie 时遇到 OP 的问题 - 例如:

    document.cookie = "my_cookie_name=my_cookie_value; expires=Thu, 11 Jun 2070 11:11:11 UTC; path=/";
    

    你可以改用:

    document.cookie = "my_cookie_name=my_cookie_value; expires=Thu, 11 Jun 2070 11:11:11 UTC; path=/; SameSite=None; Secure";
    

    它对我有用。更多信息here

    【讨论】:

      【解决方案6】:

      我在我的项目中同时使用 JavaScript Cookie 和 Java CookieUtil,以下设置解决了我的问题:

      JavaScript Cookie

      var d = new Date();
      d.setTime(d.getTime() + (30*24*60*60*1000)); //keep cookie 30 days
      var expires = "expires=" + d.toGMTString();         
      document.cookie = "visitName" + "=Hailin;" + expires + ";path=/;SameSite=None;Secure"; //can set SameSite=Lax also
      

      JAVA Cookie(在 Nginx 中设置 proxy_cookie_path)

      location / {
         proxy_pass http://96.xx.xx.34;
         proxy_intercept_errors on;
         #can set SameSite=None also
         proxy_cookie_path / "/;SameSite=Lax;secure";
         proxy_connect_timeout 600;
         proxy_read_timeout 600;
      }
      

      在 Firefox 中检查结果

      阅读更多https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-29
        • 1970-01-01
        • 2019-12-18
        • 1970-01-01
        • 2020-11-01
        • 2019-09-27
        • 2021-01-04
        • 1970-01-01
        相关资源
        最近更新 更多