DevGuard:只用 Python 标准库构建的零依赖安全扫描器
Zero Dependency 2026 的产物:DevGuard——一个只靠 Python 标准库的轻量安全扫描器,扫描代码库与依赖清单。约束简单:不依赖第三方运行时包。这个约束影响了几乎每个设计决策。
为什么做
开发者会经源码文件、环境文件、私钥等敏感项目资产意外暴露凭据。想要一个小工具提供即时第一层保护,不需要大安全栈。不做商业安全平台的每个能力,聚焦三项实用检查:
- SecretScanner:检测疑似硬编码密钥与私钥材料;
- FileRiskScanner:检测敏感文件(.env、SSH 密钥、凭据文件、证书容器);
- DependencyScanner:检测依赖清单并记录声明的依赖——不假装"依赖=自动有漏洞"。
架构:统一 Finding 契约
核心思想:每个扫描器返回同一类结果。所有扫描器实现共享接口,返回标准化的 Finding 对象:
file / line / rule / severity / message
例如 Finding(file="path/to/file", line=12, rule="HARDCODED_SECRET", severity="HIGH", message="Possible hardcoded credential detected")。检测逻辑与报告/呈现分离——加一个新扫描器不需要重新设计整个应用。
从 CLI 到本地仪表盘
不只停在终端输出。后端用 Python 内置 http.server,前端纯 HTML/CSS/JS——没有 Flask、没有 FastAPI、没有 React 依赖。本地服务既暴露扫描 API 又直接服务仪表盘,展示:整体安全分、风险等级、严重度计数、按扫描器分的发现、详细发现信息、建议修复。
可解释的安全评分
确定性风险引擎:100 分起,每个 finding 固定扣分——CRITICAL -30、HIGH -15、MEDIUM -7、LOW -2,最终分数钳制在 0–100,映射风险等级(90–100 LOW、70–89 MEDIUM、40–69 HIGH、0–39 CRITICAL)。刻意保持简单可解释:开发者应该能明白分数为什么变,而不是信任一个解释不了的安全数字。
密钥检测不只是搜 "password"
朴素扫描器搜关键词(password、api_key、api_token…),但关键词匹配制造误报:password = os.getenv("PASSWORD") 不含真实密码,而 password = "actual-secret..." 才是要抓的。DevGuard 的做法区分"引用"与"实际赋值",降低误报、提高真正命中的比例。
实践建议
- 零依赖约束会逼出好设计:统一 finding 契约让扫描器可插拔,仪表盘与 CLI 共用一份结果;
- 密钥扫描别用关键词匹配,先识别赋值模式再判"是否真密钥";
- 依赖扫描的诚实边界很重要:记录声明依赖 ≠ 声明漏洞,把"可能有问题"与"确定有问题"分开。
来源:DevGuard: A Zero-Dependency Security Scanner Built from Python's Standard Library - DEV Community