先前设置的“ Samesite:Strict” cookie在document.cookie中不可用。Firefox和Safari

时间:2019-05-01 13:27:43

标签: firefox cookies safari csrf samesite

我们在用户会话开始时为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.comtest.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>

1 个答案:

答案 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,我强烈建议您使用“宽松”设置。这个名称令人困惑,不是安全性松懈(实际上,它比引入相同站点之前的安全性更高。)