如何修复“将SameSite Cookie设置为无”警告? Chrome扩展程序

时间:2019-10-01 20:39:10

标签: php cookies google-chrome-extension

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

$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问题的说明进行操作。

7 个答案:

答案 0 :(得分:9)

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

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

注意:与问题没有直接关系,但对其他人来说可能很有用,因为这是我在网站开发过程中一开始所关心的问题:

如果您从问题中看到警告,该警告列出了一些第三方网站(在我的情况下是google.com,是吧)-这意味着他们需要修复它,与它无关您的网站。当然,除非警告提到您的网站,否则在这种情况下添加Secure应该可以解决该问题。

答案 1 :(得分:8)

对此我也处于“反复试验”中,但是Google Chrome Labs的Github的这个回答对我有所帮助。我将其定义到我的主文件中,并且仅在一个第三方域中有效。仍在进行测试,但我渴望通过更好的解决方案来更新此答案:)

如果您的PHP一直到7.2,就像我的服务器那样:

header('Set-Cookie: cross-site-cookie=name; SameSite=None; Secure');

或者如果您的主机已经更新到7.3,则可以使用:

setcookie('cross-site-cookie', 'name', ['samesite' => 'None', 'secure' => true]);

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

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

请参见以下网址的完整代码:https://github.com/GoogleChromeLabs/samesite-examples/blob/master/php.md,他们也有same-site-cookies的代码。

答案 2 :(得分:8)

>= 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>";

答案 3 :(得分:2)

我最终通过安装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”和不带有“ always”的指令。我还没有测试过。

答案 4 :(得分:1)

如果您遇到使用 JavaScript 设置Cookie的操作程序问题,例如:

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

答案 5 :(得分:1)

我在项目中同时使用了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中查看结果 enter image description here

详细了解https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite

答案 6 :(得分:-1)

对于那些无法创建PHP会话并在本地使用活动域的人。 您应该先删除实时网站的安全Cookie。

完整答案; https://stackoverflow.com/a/64073275/1067434