# API 巡检 B2 — sync_v2.py + files.py + remote_path_validation.py

**日期**: 2026-06-06  
**范围**: 22 个 `/api/sync/*` 端点 + `GET /api/files/browse` + 路径校验模块

## 结论

| 级别 | 数量 | 说明 |
|------|------|------|
| P0 | 0 | — |
| P1 | 0 | — |
| P2 | 1 | 已修：`SyncFiles`/`SyncVerify` `server_ids` 无上限 |
| H | 1 | `_audit_sync` 写失败仅 warning（不阻断业务） |

**批次结论**: **PASS**

---

## 覆盖摘要

| 检查项 | 结果 |
|--------|------|
| 全部 sync 端点 JWT | ✓ 22/22 `get_current_admin` |
| 远程路径 | ✓ `normalize_remote_abs_path` / `remote_join` |
| 本地 staging | ✓ `ensure_under_nexus_upload` 限制 `/tmp/nexus_upload_*` |
| Shell 拼接 | ✓ 普遍 `shlex.quote` |
| 上传限制 | ✓ 单文件 100MB；ZIP 500MB |
| 剪贴板 copy/move | ✓ `assert_clipboard_transfer_safe` 防 dest 在源子树内 |
| files GET browse | ✓ ETag + 路径规范化 + 审计 |

---

## FINDING

### P2-02 — `SyncFiles` / `SyncVerify` `server_ids` 无 max_length（已修）

- **风险**: 超大列表导致海量协程调度与 DB 查询（verify 虽 Semaphore(5) 仍会创建 N 个 task）。
- **修复**: `max_length=2000`（对齐平台子机规模上限）。
- **文件**: `server/api/schemas.py`

### H-04 — `_audit_sync` 异常时 `logger.warning` 不向上抛

- **位置**: `sync_v2.py` `_audit_sync`
- **处置**: 接受 — 审计失败不应阻断文件操作；已有 exc_info 日志。

---

## 安全亮点

- `file-ops` delete 使用 `rm -rf` 但路径经 `normalize_remote_abs_path` 校验
- `upload` 文件名剥离 `/` `\`
- `local-file-ops` rename 禁止 `..` / `.`
- `write-file` 5MB 上限 + etag 乐观锁（409）
- `read-file` 1MB 默认上限

---

**下一批**: B3 — auth + auth_jwt + dependencies
