我创建了一个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=None
和Secure
,则仅会发送带有跨站点请求的cookie。您可以在Application> Storage> Cookies下的开发人员工具中查看Cookie,并在https://www.chromestatus.com/feature/5088147346030592和https://www.chromestatus.com/feature/5633521622188032上查看更多详细信息。
我试图创建这样的cookie,但没有帮助。
setcookie($cookie_name,$cookie_value, time() + 3600*24, "/;samesite=None ","mydomain.com", 1);
按照this问题的说明进行操作。
答案 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;
}
详细了解https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
答案 6 :(得分:-1)
对于那些无法创建PHP会话并在本地使用活动域的人。 您应该先删除实时网站的安全Cookie。