您如何防止第一次通过 HTTP 发送 cookie 数据?

信息安全 tls 网页浏览器 饼干 hsts
2021-08-12 14:08:43

您可以使用 HSTS 告诉浏览器在以后的请求中始终使用 HTTPS。

您可以使用从现在开始仅通过 HTTPS 发送 cookie 的 Cookie Secure 标志。

您可以使用基于 DNS 的重定向,但只有在 HTTP 请求到达那里之后..

我的问题是如何确保用户始终以 HTTPS 访问该站点,并且即使是第一次也不通过 HTTP 发送任何数据。

编辑:

鉴于缺乏解决方案,我认为浏览器默认情况下应该首先自动发送 https 请求并且它不起作用然后降级。

编辑:

没有评论的问题,因为是,答案没有意义。两者似乎都在谈论不同的事情,所以我想提供一些背景信息。

  1. 用户第一次输入http://abc.com
  2. abc.com 不在 hsts 预加载列表中
  3. 所以浏览器继续并通过非 ssl 路径发出请求
  4. 请求被 Mitm 拦截,攻击者代为发出请求
  5. 服务器说更新到 ssl 并发送注册/登录表单
  6. 攻击者将 HIS 与服务器的连接升级为 SSL,但不告诉用户和代理 html 给用户。(不告诉用户升级到 https,因为黑客提供的证书无效)
  7. 用户将所有内容输入 http 页面
  8. 黑客甚至可能将其 cookie 传递给用户。
  9. 允许将来访问数据,直到 cookie 被撤销。
4个回答

总结评论(并替换我之前的答案):只要 sslstrip 是可能的,攻击者就可以冒充用户并控制会话,而浏览器认为用户控制会话。只有 HSTS 可以阻止 sslstrip,只有 HSTS 预加载可以阻止第一个请求的 sslstrip(在获取 HSTS 标头之前)。

因此,正如Benoit Esnard 在回答中正确指出的那样,HSTS 预加载应该是正确的方法

问题是,HSTS 预加载可能需要几个月的时间才能用于新域,因为更新的列表仅随新版本的浏览器一起提供(至少在 Google Chrome 的情况下)。

换句话说:没有可以在短时间内实施的解决方案。

将您的网站提交到HSTS 预加载列表

HSTS 预加载列表是嵌入在浏览器中的主机名列表,允许它们知道哪些网站必须仅作为 HTTPS 进行爬网,从而防止任何非 HTTPS 请求。

您所描述的称为会话固定攻击(维基百科链接)

简而言之,问题在于攻击者可以给你一个 Session Identifier cookie。您使用此 cookie 登录,服务器会将您的身份与此 cookie 相关联。

攻击者仍然知道您的会话 id cookie,并且可以在服务器上伪装成您。攻击完成。

为了防止这种情况,服务器必须在有人登录时更改会话 id cookie。攻击者留下了一个陈旧的毫无价值的 cookie,并且无能为力。

并非所有 Web 框架都允许您更改会话 cookie。如果这是一个问题,您可以为此目的使用不同的 cookie,即框架不知道的单独的“经过身份验证的 cookie”。每次登录时也必须更改此 cookie。

您无法阻止 cookie第一次通过 HTTP提交,但您可以采取措施将由此造成的损害降至最低。基本原则是,您永远不会尊重通过 HTTP 提交的任何内容,并且无论何时收到明文形式的敏感信息,您都会将该信息视为已泄露。

将您的站点设置为从 HTTP 重定向到 HTTPS,并开始发送 Strict-Transport-Security 标头。(在您准备好之前,您不必进行预加载;我要说的无论如何都会起作用。)

然后,每当您看到通过明文 HTTP 提交的 cookie 时,都会使服务器端的所有这些 cookie 无效。此时不要试图将它们从浏览器的 cookie jar 中踢出,因为它不能保证工作有几个原因(明文 HTTP 响应无法操作标记为 Secure 的 cookie,旧浏览器可能会忽略 max-age=0 , 中间人可能会完全剥离 Set-Cookie 以使受害者继续使用受损的 cookie)。但是当它们出现在后续的 HTTPS 请求中时,不要尊重它们。此时(即仅当您建立了安全通道时),发出新的会话令牌并要求用户再次登录。

同样,如果您看到您的登录表单以明文形式提交,不要只是使会话 cookie 无效,锁定帐户不要将帐户恢复、登录或注册表单从 HTTP 重定向到 HTTPS;相反,发出一条错误消息,指示人们手动修复 URL(它就像一个验证码,但它是为了绕过 sslstrip 中的 URL 重写 ;-)。任何只有登录用户才能访问的页面在通过明文访问时应该重定向到首页,而不是 HTTPS 本身。

此外,请确保您的会话 cookie 既不可伪造毫无意义如今,大多数 Web 框架都会自动为您执行此操作,但如果您没有,最简单的构造是:每个会话 cookie 都是一个很大的(64 位可能就足够了,128 位就足够了)随机数,生成由加密安全的 RNG加上签名该号码的消息验证码。您可以为此使用对称 MAC,因为 cookie 只需要由站点进行身份验证,该站点是发布 MAC 的同一实体,因此它两次都知道相同的秘密。如果 cookie 带有无效的 MAC,请忽略它,不管你是如何得到它的——假装你根本没有得到它。(这甚至取代了关于使通过 HTTP 传入的 cookie 无效的规则。您不希望攻击者能够通过伪造请求来强制注销用户。)但是如果 MAC 是有效的,那么您使用随机数作为记录与用户会话相关的所有实际信息的数据库表的键。

在有人尝试登录之前,最好不要发布任何 cookie。这使得 MITM 更难获得有效的 cookie,也让您更容易遵守 GDPR。


在阅读了关于其他答案的讨论之后,我现在意识到 OP 关注一个非常特殊的场景:该站点的新用户第一次通过中间人访问它,该中间人正在终止 HTTPS,剥离退出 HSTS 并重写所有链接,并将未加密的站点转发给假设的新用户。与此相反,确实,唯一可能有帮助的是 HSTS 预加载。在没有 HSTS 预加载的情况下,新用户的帐户将“生而受到威胁”,攻击者将知道有关它的一切:不仅是会话 cookie,还包括用户名和密码,以及用于帐户的电子邮件地址恢复,以及受害者输入的每一点个人信息。这是令人讨厌的,唉,比你想象的更合理。

但是,如果您只有一次机会通过未被主动篡改的渠道与用户进行交互,您可以推送 HSTS 和安全会话 cookie,以上所有建议都会很有用。