0deps 运动:本地依赖与安全
软件开发人员在几乎每个项目中都会安装数百个外部库。现代框架通常依赖于数千个隐藏的依赖项。这为软件供应链带来了巨大的风险。
0deps 运动提出了一个简单的问题: 如果你的应用程序只运行你控制的代码会怎样?
每个依赖项都会增加你的攻击面。依赖项可能会:
- 引入安全漏洞。
- 成为攻击目标。
- 停止接收更新。
- 修改代码并导致你的应用崩溃。
- 添加新的隐藏依赖项。
在 0deps 模型中,你将每个依赖项直接放入你的项目仓库中。你不会在构建期间下载它们。从一开始,所有内容都保留在你的仓库内部。
这种方法提供了:
- 可复现的构建。
- 减少对外部注册表的依赖。
- 更容易进行安全审计。
- 更具可预测性的代码。
其核心思想并不是阻止代码发生变化。算法和安全补丁必须变化。保持不变的是公共契约(public contract)。
一个库展示了一组特定的函数。这些函数构成了一个契约。
authenticate()createSession()verifyPasskey()
库内部的实现可以完全改变。你可以更换算法或数据结构。你应用程序的其他部分并不会受到影响,因为接口保持不变。
当安全漏洞出现时,你会面临两个问题:
- 修复漏洞。
- 确保更新不会破坏你的应用。
0deps 架构解决了第二个问题。你更新接口背后的代码。公共 API 保持不变。你的应用程序无需任何更改即可继续运行。
你通过内部适配器将外部工具隔离起来: 应用程序 ↓ 公共接口 ↓ 适配器 ↓ 实现
如果一个库停止维护,你只需要更改适配器。你应用的其余部分依然安全。库的版本变成了一个微小的细节,而不是一个重大的难题。
目标不是让软件变得完美。目标是降低供应链风险。通过消除动态安装,你可以阻止:
- 恶意软件包发布。
- 被攻破的注册表。
- 依赖混淆攻击。
每一行代码都成为了你项目的一部分。这实现了完全的控制和审查。
项目持续数年。库和框架会消失。有了 0deps,即使生态系统发生变化,你的应用程序仍能继续使用相同的契约。
