我们在用户会话开始时为XSRF / CSRF设置了cookie。用户有时会导航到其他域(例如付款),执行一些操作,然后导航到我们的域。返回我们的域后,Firefox和Safari无法读取设置为同一站点的cookie:严格,Chrome可以。如果使用的是Chrome和Firefox(而不是Safari),则确实会在Cookie的开发人员工具部分下显示。
samesite explanation on MDN解释说,在将来的请求中,cookie将随Request头一起发送。对于所有三种浏览器,都是这种情况。解释尚无定论,是是否应该可以通过document.cookie读取此cookie。对于Firefox,Safari和Chrome,我们可以读取“松散” Cookie,但对于只有Chrome的我们可以读取“严格” Cookie。在刷新页面时也是如此,但在打开新标签页时(即仅通过导航)不是这样。
这是Safari和Firefox还是Chrome中的错误-规范是否定论?规格(w3?)是什么?
可以使用具有两个test.internalsite.com
和test.externalsite.com
两个虚拟主机的Web服务器在本地轻松地重新创建它,并且这些页面还包含一些PHP:
<?php
setcookie("CSRFLax", "hiLax", array("path"=>"/", "samesite"=>"Lax", "domain"=>"test.internalsite.com"));
setcookie("CSRFStrict", "hiStrict", array("path"=>"/", "samesite"=>"Strict", "domain"=>"test.internalsite.com"));
?>
<html>
<body>External site
<p><a href="http://test.externalsite.com">Go to External site</a></p>
<p>Document cookie: <script>document.write(document.cookie);</script></p>
</body>
</html>
和
<html>
<body>External site
<a href="http://test.internalsite.com">Go to internal Site</a>
</body>
</html>
答案 0 :(得分:1)
根据我们的安全人员的建议,我们不打算讨论使用“宽松” Cookie而不是“安全” Cookie(出于语义上我没有其他原因)的可能性,我们实施了一个简单的解决方法通过刷新页面。这样可以在Chrome和Safari中检索严格的Cookie。
var canReadStrictCookie = function(cookies) {
return cookies.toLowerCase().indexOf('mySameSiteSecureCookieName') !== -1;
};
if(document.location.href.indexOf('jmkCheck') === -1 && !canReadStrictCookie(document.cookie)){
document.location.href='?jmkCheck';
}
如果您自己控制Cookie,我强烈建议您使用“宽松”设置。这个名称令人困惑,不是安全性松懈(实际上,它比引入相同站点之前的安全性更高。)