【问题标题】:Redirect HTTP to HTTPS or deny usage of HTTP?将 HTTP 重定向到 HTTPS 或拒绝使用 HTTP?
【发布时间】:2018-04-27 12:50:53
【问题描述】:

在 Apache HTTPD 服务器上配置,网络上的许多文章建议通过将所有 HTTP 请求(永久)重定向到 HTTPS 来强制执行 HTTPS 协议。

以下是我理解的用户尝试访问同时支持 HTTP 和 HTTPS 的服务器时发生的情况:

  1. 客户端的用户代理(例如,但不仅限于 Web 浏览器)向 http://my.domain.com 发送请求。
  2. 服务器在端口 80 上接收请求,并将永久重定向(代码 301)发送到 https://my.domain.com
  3. 客户端的用户代理收到响应。给定状态码,它会向https://my.domain.com发送相同的请求。
  4. 服务器在 443 端口收到请求,并返回想要的内容。

因此,如果请求包含敏感数据,则在第 1 步和第 2 步之间,中间人可以在请求中以非加密方式恢复它。

如果客户端使用网络浏览器,该浏览器会缓存 301 重定向,下次客户端使用 HTTP 发送请求时,它会自动使用 HTTPS 发送。

但是,如果客户端经常清除缓存怎么办?或者使用不存储永久重定向的网络浏览器以外的其他用户代理? 我们不会在这里失去 HTTPS 的好处吗?

具体示例:REST API,请求包含敏感数据。可以从任何 HTTP 客户端(在线、嵌入软件或网站、独立)调用此 API。

在这种情况下,为了强制使用 HTTPS,禁用服务器级别的 HTTP 支持会更好吗?

2017-11-14 编辑:

sys0dm1n 在下面告诉我有关 HSTS 的信息。但是这种机制提供的安全性完全取决于用户代理是否符合规范。

2017-11-15 编辑:

我在收到第一个答案后编辑我的帖子,以明确我的担忧。

【问题讨论】:

标签: apache http security https


【解决方案1】:

为了确保您的网站始终使用 https 来确保安全,一种方法是启用 HSTS

自动将任何引用 Web 应用程序的不安全链接转换为安全链接。

要启用它,您需要在 vHost 配置中添加一个标头:

Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"

确保 Header 模块已启用。

您可以按照说明 here 添加您的域以包含在 Chrome 的 HTTP 严格传输安全 (HSTS) 预加载列表中。

这是在 Chrome 中硬编码为仅 HTTPS 的网站列表。

【讨论】:

  • HSTS 提供的安全性仅取决于用户代理是否符合规范。是否符合 SoapUI? (即,它会在将请求发送到服务器之前将协议转换为 HTTPS 吗?)是否符合 curl 标准?或任何请求工具...
【解决方案2】:

完全禁用 http 会有帮助吗?

不,我认为不会,原因如下:大概,您的客户端/浏览器在发送请求之前不知道是否存在运行 http 的站点。当然,它会收到类似 404 或类似的错误代码,但此时,原始请求已经通过网络发送,任何“中间人”很可能已经能够观察到该请求。

作为问题的简单说明,这里调用了一个伪造的 http-url,它是由 Postman 制作的,它是 Fiddler 中的一个。如您所见,返回了 502 错误,但原始请求仍包含敏感数据。

现在只是为了比较,如果我也这样做,但只是将 url 更改为 https,我会在 Fiddler 中得到不同的结果:

这会尝试建立一个隧道,并且不会泄露任何后期数据。

因此,总而言之,您最好的选择可能是启用 HSTS 并将您的网站放在 HSTS preload list 上,这应该会阻止任何 HTTP 请求开始发送(至少对于 recent versions of most major browsers)。

【讨论】:

  • 我同意它不适合公共网站。但是对于 REST API,例如。您可以指定必须使用 HTTPS 发送每个请求。所以客户会意识到这一点。是的,在使用 HTTP 的第一个请求中,攻击者可以读取潜在的敏感数据。但是,如果我的前端 Apache 服务器将其重定向到 HTTPS,那么用户会更改协议吗?没有。如果他收到错误,他将更正请求协议(特别是在自动请求工具的情况下,例如批处理脚本)。
  • 对我来说,HSTS 是一个很好的实践。我不知道它,我肯定会启用它。但我认为这还不够。
  • @Eria 你是对的,当然——对于一个 REST API,提供你的服务的 http 版本或者重定向到 https 是没有意义的——你最好提供仅限 https。我的观点是禁用 http 不会妨碍客户端发送 http 请求。另一方面,HTSTS 将完全做到这一点 - 至少对于实施它的客户而言。
猜你喜欢
  • 2019-11-28
  • 1970-01-01
  • 2015-06-23
  • 2015-02-16
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 2019-03-18
相关资源
最近更新 更多