如果我们尝试设置之前安全的 cookie,浏览器会忽略 Set-Cookie 响应标头

Posted

技术标签:

【中文标题】如果我们尝试设置之前安全的 cookie,浏览器会忽略 Set-Cookie 响应标头【英文标题】:Browsers ignore Set-Cookie response header if we try to set a cookie which was Secure before 【发布时间】:2019-03-16 17:31:07 【问题描述】:

我发现了一个奇怪的问题,不知道需要应用什么解决方法。

最简单的安全改进之一是将所有 cookie 设置为 HttpOnly 和 Secure。我知道,如果您以非安全模式(即方案是 HTTP)打开带有安全 cookie 的网站,那么 cookie 将被忽略。 但我们的情况如下。

假设有一个 URL 可以让您登录:contoso.com/AutoLogin/

如果我在 HTTPS 模式下打开它,则设置了 AUTH cookie 并且它是安全的:

GET https://contoso.com/AutoLogin/<user token>
Response: Set-Cookie: .ASPXAUTH=<cookie is here>; expires=Fri, 11-Oct-2019 14:51:40 GMT; path=/; secure; HttpOnly

那绝对没问题。我可以在开发工具中看到 cookie。 现在,相同的浏览器会话,我试图打开相同的 URL,但在 HTTP 模式下。请求 Cookie 不再具有 AUTH cookie - 由于安全 cookie 的性质,这一点很清楚并且可以预测。

GET http://contoso.com/AutoLogin/<user token>
Response: .ASPXAUTH=<here comes the cookie>; expires=Fri, 11-Oct-2019 14:54:07 GMT; path=/; HttpOnly
这次没有安全标志 - 好的。

但是,cookie 没有设置,所有后续请求都没有 AUTH cookie。 至少在 Chrome 和 Firefox 中确认了该行为(未在其他浏览器中检查)。

您可能注意到后端是使用 ASP.NET MVC 实现的。 也许,GET 请求是 AJAX 请求这一事实可能会有所帮助。

感谢您的帮助。

【问题讨论】:

你找到解决办法了吗? 请在bugzilla.mozilla.org/show_bug.cgi?id=1617361为 Firefox 报告错误报告 【参考方案1】:

我发现我 perfect article 关于这个问题。简而言之:

当网站通过 http(端口 80)和 https(端口 443)提供请求并且具有 https cookie 的安全标志时,就会发生这种情况。

如果用户首先访问 https,则站点设置安全 cookie。然后,对于任何非安全脚本的请求,服务器不会收到会话 cookie,因为请求是通过非 https 连接传播的。如果端点有会话机制,它会启动新的会话,该会话通过标头发送但不存储在浏览器中(因为浏览器已经有了这个名称的 cookie - 它只是不发送它)

不同浏览器行为的作者状态 - 有些浏览器允许通过不安全的 cookie 覆盖安全 cookie,有些则不允许。

Chrome 71 和 Firefox 64 都防止安全 cookie 在纯 http 上被覆盖。我测试了 Edge 42,但它的工作方式不同,它会用非安全 cookie 覆盖安全 cookie。 Safari 12 的工作方式与 Edge 类似。

我想唯一的解决方案是仅以一种所需的方式使用网站 - 是否安全。

【讨论】:

谢谢。这解决了我在尝试通过 http localhost 加载 cookie 时收到 this set-cookie was blocked because it was not sent over a secure connection and would have overwritten a cookie with the Secure attribute. 的问题,因为 cookie 之前是通过 https localhost 提供的。一旦我从 https localhost 中删除了 cookie,cookie 就会通过 http localhost 正确加载。 如果你已经有一个名为“xx”的cookie,并且具有安全属性,那么尝试访问一个http资源将导致: 1.chrome在请求http资源时丢弃cookie“xx”; 2.如果服务器响应设置cookie名称为“xx”,它将失败(chrome不允许)

以上是关于如果我们尝试设置之前安全的 cookie,浏览器会忽略 Set-Cookie 响应标头的主要内容,如果未能解决你的问题,请参考以下文章

cookie安全小知识

django:我们可以通过邮递员中的cookie通过会话ID并登录吗

firefox火狐浏览器如何设置安全选项

即使在设置 SameSite=None 之后,Safari 也不发送 cookie;安全的

Web安全:你必须知道的“Cookie安全”

使用vue-cookies操作cookie