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

时间:2018-10-11 15:03:30

标签: authentication cookies https

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

最简单的安全性改进之一是将所有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。 现在,相同的浏览器会话,并且我试图以HTTP模式打开相同的URL。请求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请求这一事实可能会有所帮助。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

perfect article发现了这个问题。简而言之:

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

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

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

  

Chrome 71和Firefox 64均可以防止在纯http上覆盖安全cookie。我测试了Edge 42,它的工作方式不同,它将用非安全cookie覆盖安全cookie。 Safari 12的工作方式类似于Edge。

我猜唯一的解决方案是仅以一种期望的方式使用网站-是否安全。