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

Mar*_*oma 5 flask bandit

我最近看到强盗抱怨B104

绑定到所有网络接口可能会打开非预期接口上的流量服务,这可能没有正确记录或保护。此插件测试查找字符串模式“0.0.0.0”,该字符串模式可能指示对所有网络接口的硬编码绑定。

>> 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))
Run Code Online (Sandbox Code Playgroud)

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

我已经在 Flask 应用程序中看到了这一点app.run(host="0.0.0.0")。应该写什么?

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

osc*_*ter 5

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

每当您尚未准备好进行生产或无意接受来自任何地方的传入连接时,都应该有一个安全的默认. 通常这是“127.0.0.1”或“localhost”,因此只接受来自本地机器的传入连接。这并不能保护您的代码免受 SQL 注入,但它可以防止其他人针对您的代码并针对您的项目执行 SQL 注入。

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

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