# PII 与暴露面扫描

扫描仓库中可能泄露的个人身份信息（PII）和内部基础设施信息。

**安全原则：扫描时只报告文件路径和行号，禁止输出匹配到的原始内容。**

## PII 扫描规则

### P-001: 邮箱地址

```bash
# 搜索邮箱地址（排除 vendor 和 node_modules）
git grep -n -E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' \
  -- '*.go' '*.js' '*.ts' '*.md' '*.yaml' '*.yml' '*.json' \
  ':!vendor/' ':!node_modules/' 2>/dev/null
```

### P-002: 手机号（中国大陆）

```bash
git grep -n -E '\b1[3-9][0-9]{9}\b' -- ':/' ':!vendor/' ':!node_modules/' 2>/dev/null
```

### P-003: 身份证号（中国大陆）

```bash
git grep -n -E '\b[0-9]{17}[0-9Xx]\b' -- ':/' ':!vendor/' ':!node_modules/' 2>/dev/null
```

## 暴露面扫描规则

### E-001: 内网 IPv4 地址

```bash
# 搜索内网 IP 地址
git grep -n -E '\b10\.[0-9]+\.[0-9]+\.[0-9]+\b' -- ':/' ':!vendor/' ':!node_modules/' 2>/dev/null
git grep -n -E '\b172\.(1[6-9]|2[0-9]|3[01])\.[0-9]+\.[0-9]+\b' -- ':/' ':!vendor/' ':!node_modules/' 2>/dev/null
git grep -n -E '\b192\.168\.[0-9]+\.[0-9]+\b' -- ':/' ':!vendor/' ':!node_modules/' 2>/dev/null
```

### E-002: localhost / 127.0.0.1

```bash
git grep -n -E 'localhost:[0-9]+|127\.0\.0\.1:[0-9]+' -- ':/' ':!vendor/' ':!node_modules/' 2>/dev/null
```

### E-003: 内部域名 / 测试域名

```bash
git grep -n -E '\.local\b|\.internal\b|trustie\.net' -- ':/' ':!vendor/' ':!node_modules/' 2>/dev/null
```

### E-004: .devops 配置中的裸 IP

```bash
# 检查 CI/CD 配置中的 IP 地址
find .devops -type f -name '*.yml' -exec grep -n -E '\b[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\b' {} + 2>/dev/null
```

### E-005: 公网裸 IP

```bash
# 搜索非 localhost 的公网 IP（排除已知公开 IP 范围）
git grep -n -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' -- ':/' ':!vendor/' ':!node_modules/' \
  | grep -v '127\.0\.0\.1' \
  | grep -v '0\.0\.0\.0' \
  | grep -v '255\.255\.255\.255' 2>/dev/null
```

## 已知可忽略项

以下匹配已知不会造成安全问题：

| 文件 | 内容 | 原因 |
|------|------|------|
| `npm/package.json` | `support@gitlink.org.cn` | 公开支持邮箱 |
| `doc/gitlink_api_reference.md` | `yystopf@163.com` | API 文档示例数据 |
| `doc/gitlink_api_reference.md` | `localhost:3000/api/` | 开发环境 URL |
| `.devops/gitlink-cli-autodeploy.yml` | `121.41.222.0` | 部署服务器公网 IP |

## 执行完整扫描

```bash
echo "=== P-001: 邮箱 ==="
git grep -n -E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' \
  -- '*.go' '*.js' '*.ts' '*.md' '*.yaml' '*.yml' '*.json' \
  ':!vendor/' ':!node_modules/' ':!doc/' 2>/dev/null

echo "=== P-002: 手机号 ==="
git grep -n -E '\b1[3-9][0-9]{9}\b' -- ':/' ':!vendor/' ':!node_modules/' 2>/dev/null

echo "=== E-001: 内网 IP ==="
git grep -n -E '\b(10\.|172\.(1[6-9]|2[0-9]|3[01])\.|192\.168\.)' -- ':/' ':!vendor/' ':!node_modules/' 2>/dev/null

echo "=== E-002: localhost ==="
git grep -n -E 'localhost:[0-9]+|127\.0\.0\.1:[0-9]+' -- ':/' ':!vendor/' ':!node_modules/' 2>/dev/null

echo "=== E-003: 内部域名 ==="
git grep -n -E '\.local\b|\.internal\b|trustie\.net' -- ':/' ':!vendor/' ':!node_modules/' 2>/dev/null
```

## 排除列表

以下内容不标记：

| 模式 | 原因 |
|------|------|
| `user@example.com` | RFC 示例邮箱 |
| `test@test.com` | 测试用邮箱 |
| `noreply@*.com` | 无回复邮箱 |
| `support@*` | 公开支持邮箱 |
| `gitlink.org.cn` | GitLink 官方公开域名 |
| `github.com` | GitHub 公开域名 |
| `cdn.jsdelivr.net` | 公共 CDN |
| `.github/workflows/` 中的 `${{ secrets.* }}` | CI/CD 变量引用 |
