## 安全漏洞检测

> 安全漏洞检测基于**污点分析**模型：追踪用户可控数据（Source）从输入到危险操作（Sink）的传播路径。
> 本文件是检测路由表——根据代码特征定位需要加载的检测项子文件。

### 检测路由表

| 触发信号（代码特征） | 触发检测项 | 文件 |
|---------------------|-----------|------|
| 字符串拼接构造查询（SQL/NoSQL/LDAP/Shell） | 注入 | [injection.md](injection.md) |
| ORM 查询中使用用户输入拼接字符串（非参数化） | 注入 | [injection.md](injection.md) |
| 模板引擎渲染用户输入（`render`/`template`/`compile`） | 注入 | [injection.md](injection.md) |
| 用户输入直接拼接到 HTML/响应体（`innerHTML`、模板字面量拼接到 HTML） | XSS | [xss.md](xss.md) |
| `document.write`/`eval`/`setTimeout(string)` 接收用户输入 | XSS | [xss.md](xss.md) |
| 文件路径来自用户输入（`open`/`readFile`/`send_file` 参数可控） | 路径穿越 + SSRF | [path-traversal.md](path-traversal.md) |
| URL 来自用户输入且发起请求（`fetch`/`http.get`/`requests`） | 路径穿越 + SSRF | [path-traversal.md](path-traversal.md) |
| 重定向目标来自用户输入（`redirect`/`Location` header） | 路径穿越 + SSRF | [path-traversal.md](path-traversal.md) |
| 文件上传接口（`multer`/`multipart`/`upload`） | 文件上传 | [file-upload.md](file-upload.md) |
| 密码/Token 比较使用 `==` 而非常量时间比较 | 认证与会话 | [auth-session.md](auth-session.md) |
| 会话管理（`session`/`cookie`/`jwt`/`token`）相关代码 | 认证与会话 | [auth-session.md](auth-session.md) |
| 对象属性从请求参数直接映射（`Object.assign`/`req.body` 赋值给模型） | 访问控制 | [access-control.md](access-control.md) |
| API 端点操作资源但未校验当前用户权限 | 访问控制 | [access-control.md](access-control.md) |
| 硬编码密钥/密码（`password`/`secret`/`apikey` 赋值为字符串常量） | 加密缺陷 | [crypto-failures.md](crypto-failures.md) |
| 使用弱加密算法（`md5`/`sha1`/`DES`/`RC4`/`ECB`） | 加密缺陷 | [crypto-failures.md](crypto-failures.md) |
| `console.log`/`logger` 输出包含敏感数据（密码、Token、身份证） | 敏感数据泄露 | [data-exposure.md](data-exposure.md) |
| 错误响应中暴露堆栈/内部信息（`err.stack`/`ex.message` 直接返回） | 敏感数据泄露 | [data-exposure.md](data-exposure.md) |
| `pickle.loads`/`unserialize`/`JSON.parse` 反序列化不可信数据 | 反序列化 | [deserialization.md](deserialization.md) |
| XML 解析配置允许外部实体（`external_entities`/`DTDEntityResolver`） | 反序列化 | [deserialization.md](deserialization.md) |
| CORS 配置为 `*` 或允许任意 Origin | 安全配置 | [misconfiguration.md](misconfiguration.md) |
| 缺少安全响应头（`X-Frame-Options`/`CSP`/`HSTS`） | 安全配置 | [misconfiguration.md](misconfiguration.md) |
| 敏感接口无限流/限流过于宽松 | 安全配置 | [misconfiguration.md](misconfiguration.md) |

### 使用方式

1. 读取变更代码，识别上述触发信号
2. 按匹配到的触发信号，**只加载**对应子文件（无需全量加载）
3. 无匹配触发信号 → 不执行安全漏洞检测
4. 检测时使用**污点分析**方法：Source（用户输入） → Propagator（数据传递） → Sink（危险函数）

### 污点分析模型

```
Source 来源：
  HTTP 请求（Header/Body/Query/Cookie/Path 参数）
  RPC/消息队列/WebSocket 输入
  数据库/Redis/配置文件中的不可信数据
  环境变量/命令行参数

Propagator 传播：
  变量赋值、函数参数传递、字符串拼接、对象属性传播

Sink 危险操作：
  → 对应各子文件中的具体 Sink 列表
```

### 防御机制识别（排除误报）

检测到 Source → Sink 路径后，还需确认是否存在防御机制：
- **输入验证**：白名单校验、类型转换（`parseInt`、`Number()`）
- **参数化查询**：预处理语句、ORM 参数化方法
- **输出编码**：HTML 转义、URL 编码、JSON 序列化
- **净化函数**：`DOMPurify`、`escape`、`sanitize`
- 框架自动保护（如 React JSX 默认转义）

### 通用排除规则

以下情况不报告缺陷：
- **测试文件**：`*.test.*`、`*.spec.*`、`__tests__/` 目录
- **生成的代码**：`generated/`、`*.generated.*`、`node_modules/`、vendor
- **第三方依赖**：不可控的外部库代码
- **有明确 TODO/FIXME 注释**：开发者已知悉的问题
- **已有防御机制**：Source 到 Sink 之间存在有效的净化或验证
