绑定到所有接口有什么问题,有哪些替代方案?

What is the issue with binding to all interfaces and what are the alternatives?

最近看到土匪抱怨B104:

Binding to all network interfaces can potentially open up a service to traffic on unintended interfaces, that may not be properly documented or secured. This plugin test looks for a string pattern “0.0.0.0” that may indicate a hardcoded binding to all network interfaces.

>> Issue: Possible binding to all interfaces.
   Severity: Medium   Confidence: Medium
   Location: ./examples/binding.py:4
3   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
4   s.bind(('0.0.0.0', 31137))
5   s.bind(('192.168.0.1', 8080))

“为非预期接口上的流量打开服务”是什么意思?

我在 app.run(host="0.0.0.0") 的 Flask 应用程序中看到了这个。应该写什么呢?

(作为旁注:这在生产中没有使用。这主要是为了在开发过程中进行简单的测试。但我不确定 gunicorn 是否可能有类似配置的相同问题)

当绑定到“0.0.0.0”时,您接受来自任何地方的传入连接。当您的代码经过测试并且您的项目是“安全的”(例如针对 SQL 注入或其他此类恶意攻击)时,您会在生产环境中执行此操作。

只要您还没有做好生产准备,或者当您不是有意接受来自任何地方的传入连接时,都应该有一个安全默认值。通常这是“127.0.0.1”或 'localhost',因此只接受来自本地计算机的传入连接。这并不能保护您的代码免受 SQL 注入,但它可以防止其他人以您的代码为目标并对您的项目执行 SQL 注入。

请注意,测试不会抱怨绑定到 0.0.0.0 一般,而是抱怨 无意中 绑定到 0.0 .0.0(因此可能是整个世界)。因此,应避免任何 0.0.0.0 的硬编码引用(以创建 above-mentioned 安全默认值)。

至于替代方案,您可以在开发时使用 127.0.0.1 或本地主机,或者您可以使用本地网络接口启用本地网络上其他计算机的访问。使用您的网络接口将允许您在计算机上构建和托管 Web 应用程序,并在 phone 上测试结果(如果它们连接到同一 WiFi)。