代码安全审查·免费版
红线
- 只报告可证伪的问题:每条必须给出「文件位置 + 触发路径」,拒绝"建议加强安全意识"这类空话。
- 不执行破坏性操作:禁止运行会修改数据、发起网络攻击、删除文件的命令。
- 不泄露密钥:报告中密钥只显示前 4 位 + 掩码(如
sk_a1b2****),绝不完整输出。 - 不引用任何付费端点/商业扫描服务:全部基于本地静态检查与公开方法。
何时使用
- 提交前想扫一遍自己写的代码。
- 接手陌生项目,先摸清安全风险面。
- 代码里疑似硬编码了密钥/口令。
- 想确认依赖包有没有已知风险。
反触发(不要用):
- 需要合规认证级审计报告(等保、PCI-DSS)→ 需专业机构,本技能只做工程自查。
- 需要对线上系统做渗透测试 → 需授权与专业工具,本技能只做静态代码审查。
- 只想要代码风格/性能建议 → 用通用代码审查技能。
职责边界
- 做:静态审查、识别常见漏洞模式、输出分级修复清单、给出修复代码示意。
- 不做:实际攻击验证、线上渗透、合规认证、替用户承担安全责任。
主流程
第 1 步:摸清攻击面(质检闸 A)
先不急着看代码细节,快速定位高风险区域:
# 找疑似密钥/口令硬编码
grep -rInE "(api[_-]?key|secret|password|passwd|token|private[_-]?key)" \
--include="*.py" --include="*.js" --include="*.ts" --include="*.env*" .
# 找危险函数
grep -rInE "(eval\(|exec\(|innerHTML|dangerouslySetInnerHTML|system\(|os\.popen)" .
# 找 SQL 拼接
grep -rInE "(SELECT .*\+|INSERT .*\+|f\"SELECT|f'SELECT)" .
同时确认:项目语言/框架、是否有认证、是否处理用户输入、是否有文件上传、依赖清单在哪。
> 质检闸 A:必须列出「入口点清单」(API 路由、表单、文件上传、回调接口),
> 没列出来不许进入下一步——不知道输入从哪来,就没法判断风险。
第 2 步:六大面逐项检查
1. 注入类
- SQL 注入:字符串拼接构造查询?参数化了吗?
- 命令注入:用户输入进了
system/exec/subprocess(shell=True)吗? - 模板注入:用户输入当模板渲染了吗?
- XSS:用户输入直接
innerHTML或未经转义输出到页面?
2. 认证与授权
- 密码怎么存的?(明文/MD5/SHA1 → 高危;bcrypt/argon2 → OK)
- 会话令牌:随机性够吗?有过期吗?
- 越权检查(最容易漏):改一个 ID 能不能看到别人的数据?(IDOR)
- 是否有默认口令、硬编码管理员账号?
3. 敏感数据
- 日志里打了密码/身份证/手机号吗?
- 错误信息是否泄露堆栈、路径、数据库结构?
- 传输是否 HTTPS?敏感数据有没有加密存储?
4. 密钥管理
- 代码里是否硬编码密钥?(含
.env被提交进仓库的情况) .gitignore是否忽略了.env、密钥文件?- Git 历史里是否曾提交过密钥?(提交后删除也算泄露)
5. 依赖与供应链
- 依赖是否锁定版本?
- 是否有长期未更新/已归档的包?
- 依赖数量是否异常膨胀(可能混入恶意包)?
6. 配置与错误处理
- 生产环境是否开了 DEBUG?
- CORS 是否是
*? - 是否有 fail-open 逻辑(出错反而放行)?
第 3 步:输出分级清单(质检闸 B)
每条问题按统一格式:
【严重级】问题标题
位置:<文件路径>:<行号>
触发路径:<攻击者怎么走到这里,具体输入是什么>
危害:<能造成什么后果>
修复:<具体怎么改,给代码示意>
严重级定义:
| 级别 | 定义 | 处理要求 |
|---|---|---|
| 🔴 严重 | 可直接获取权限/数据泄露 | 立即修 |
| 🟠 高危 | 需一定条件但后果严重 | 本迭代修 |
| 🟡 中危 | 增加攻击面/不符合最佳实践 | 排期修 |
| ⚪ 低危 | 加固建议 | 有空再修 |
> 质检闸 B:任一条问题缺「触发路径」→ 打回重查,不许靠猜。
> 若某条无法构造触发路径 → 降级为「需人工确认」并说明为什么判断不了。
第 4 步:给出修复优先级
按 可利用性 × 危害 排序,输出 Top 3 必修项,并明确:
- 哪些是「改一行就能修」的(优先做)
- 哪些需要架构调整(排期)
- 哪些是误报/可接受风险(说明理由,不制造焦虑)
失败降级
- 项目太大扫不完 → 聚焦入口点和用户输入处理路径,其余标注"未覆盖"。
- 静态检查判断不了(如运行时权限控制)→ 明确标注"需动态验证/人工确认",
不给假结论。 - 用户只要快速结论 → 输出「🔴 严重 N 条 + Top3 修复项」。
依赖
- 本地
Grep/Glob/Read(必需)。 Bash:可选用grep快速扫描;禁止执行修改类或网络请求类命令。- 无需联网、无需任何付费扫描服务。
致谢
- 原创免费技能,检查项参考公开通用的 Web 安全风险分类思路,
由本技能作者重新组织与本地化撰写。 - 灵感参考 GitHub 社区 "security-review" 类技能理念,内容全部原创重写。
- 采用 MIT 许可,不依赖任何专有实现或付费服务。