如何在咖啡店安全地开发本地 web 应用程序?

信息安全 tls Web应用程序 网页浏览器
2021-08-09 10:36:22

当我开发一个 web 应用程序时,比如说一个 Django 站点,我在本地运行它并且通常在http://localhost访问它。

我认为这本质上是安全的,因为我假设 localhost 只能在本地访问。但是,我发现即使使用自签名 HTTPS 证书运行本地 Web 服务器(Apache、Nginx ...)也无济于事,因为 localhost 并不真正需要是本地的:

在实证测试中,我们已经看到多个解析器...向网络发送 localhost 查询...结果访问“ https://localhost ”,例如,在敌对 WiFi 接入点(例如您的咖啡店)上可以被网络攻击者拦截并重定向到他们选择的站点(或证书)。(在电子邮件链“基线要求例外,第 7.1.4.2.1 节”。)

如果我正在开发一个 webapp,我需要在本地运行它并通过浏览器访问它。有时我需要在有互​​联网连接的咖啡店做这件事。如果不是本地主机,我应该使用什么接入点?

笔记

我的一些桌面应用程序还通过 HTTP 在其他端口公开自己,例如http://localhost:9000大概我也不应该在咖啡店访问那些?

4个回答

可以针对 localhost 进行安全开发,前提是:

  • 您的机器配置为将 localhost 解析为环回地址(请注意,可以更改您的主机文件以将 localhost 解析为不同的地址)
  • 您的机器配置为通过环回接口路由环回地址(可以将环回地址路由到非环回接口)
  • 您将应用程序配置为侦听环回地址,而不是 0.0.0.0(许多 Web 框架默认侦听 0.0.0.0,这可能是在开发过程中意外将服务暴露给不受信任的网络的最常见原因)
  • 如果您使用代理,您的浏览器被配置为不通过代理路由 localhost/loopback

换句话说,一个相当典型的网络配置。

另外,请注意您的数据库服务器没有绑定到 0.0.0.0,因为这将允许网络上的任何人直接连接到数据库服务器。最好设置防火墙配置,以便您确切知道本地服务正在侦听的端口和地址。

您指向的链接是在公开信任的 CA 的上下文中,该 CA 使用“localhost”名称颁发证书。在这种情况下这是不安全的,因为此类证书的接收者可能会使用该证书来拦截具有某些不寻常网络配置的某人的通信。当您完全控制自己机器的配置并且知道您的机器上没有一些奇怪的配置时,环回接口是安全的。

首先,您可以使用http://127.0.0.1绕过 DNS 查找。

其次,您可以创建自己的自签名 CA 证书,为 localhost 创建证书并安全地连接到https://localhost攻击者无法拦截该连接。

因此,在恶意 WiFi 接入点(例如您的咖啡店)上访问“ https://localhost ”可能会被网络攻击者拦截并重定向到他们选择的站点(或证书)。

这在电子邮件线程的上下文中是正确的。localhost 电子邮件主题是关于某人是否可以从受信任的 CA获得有效证书如果这是可能的,那么是的,其他人可以冒充https://localhost但是不允许公共 CA 为localhost基线要求,第 7.1.4.2.1 节;另请参阅有关 Let's Encrypt 跟踪器的讨论)颁发证书。

因为这是不可能的,所以您自己的私有 CA 是您信任的唯一颁发localhost证书的 CA。

如果你经常做这类事情,为什么不买一个旅行路由器呢?

使用小型旅行路由器,您可以使用自己的 SSID 设置您自己的内部网络,添加加密,并设置自定义白名单,以便只允许您的 MAC 地址在其上。

如果您在Docker中开发,那么当您启动 Web 应用程序(在 Docker 容器中)时,容器将拥有自己的 IP 地址,可能无法从外部访问。您将使用一个特殊的 IP 访问它,只有您可以看到,由 Docker 分配 - 例如http://172.17.0.2:9000

您的 Web 应用程序是否可以在主机的物理网络接口上访问取决于您启动容器的方式。例如,除非您使用 、 或 options ,否则该命令不会绑定docker run到主机接口-p-P--expose

其他福利:

  • 该应用程序与您的主机系统隔离。
  • 部署到其他系统的重现性更高。