test(p3-1): 第十波 - url_security 安全模块单测 72个 #714

Merged
auto-approve-bot merged 2 commits from test/p3-1-wave10-url-security-tests into develop 2026-07-22 15:43:21 +08:00
Owner

变更内容

url_security 核心安全模块全面单元测试,72个测试用例。

覆盖范围:

  • 基础校验 (18个): scheme白名单/端口白名单/URL长度/空URL/主机名校验
  • SSRF防护 (12个): 内网IP/回环/链路本地/组播/未指定/保留地址/云元数据IP/IPv6
  • 内网主机名防护 (7个): localhost/.local/.internal/metadata
  • 可信域名白名单 (4个): 精确匹配/子域名/非白名单拦截
  • is_url_safe 便捷函数 (4个)
  • 文件魔数校验 (14个): PNG/JPEG/GIF/WEBP/BMP/WAV/MP3/OGG/FLAC + 异常场景
  • 安全下载 (8个): 成功下载/MIME校验/大小限制/Content-Length预检/内网拦截
  • 常量验证 (3个)

测试结果

  • 72 passed in 4.19s
  • 全量 3280 passed, 8 skipped in 75s
### 变更内容 url_security 核心安全模块全面单元测试,72个测试用例。 **覆盖范围:** - **基础校验** (18个): scheme白名单/端口白名单/URL长度/空URL/主机名校验 - **SSRF防护** (12个): 内网IP/回环/链路本地/组播/未指定/保留地址/云元数据IP/IPv6 - **内网主机名防护** (7个): localhost/.local/.internal/metadata - **可信域名白名单** (4个): 精确匹配/子域名/非白名单拦截 - **is_url_safe 便捷函数** (4个) - **文件魔数校验** (14个): PNG/JPEG/GIF/WEBP/BMP/WAV/MP3/OGG/FLAC + 异常场景 - **安全下载** (8个): 成功下载/MIME校验/大小限制/Content-Length预检/内网拦截 - **常量验证** (3个) ### 测试结果 - 72 passed in 4.19s - 全量 3280 passed, 8 skipped in 75s
xiaoxia added 1 commit 2026-07-22 14:25:04 +08:00
test(p3-1): 第十波 - url_security 安全模块单测 72个
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 10s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 46s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 32s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 30s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 56s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m19s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m32s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 48s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 49s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m12s
AI Code Review / AI Code Review (pull_request) Successful in 5m35s
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been cancelled
911478495a
覆盖 url_security.py 核心安全逻辑:
- validate_url_safety: scheme/端口/主机名/URL长度 等基础校验
- SSRF防护: 内网IP/回环/链路本地/组播/未指定/保留地址
- 内网主机名防护: localhost/.local/.internal/metadata
- 可信域名白名单: 精确匹配+子域名匹配
- is_url_safe 便捷函数
- 文件魔数校验: PNG/JPEG/GIF/WEBP/BMP/WAV/MP3/OGG/FLAC
- safe_download_file / safe_download_bytes (mock网络)
- 大小限制 / MIME类型白名单 / Content-Length预检

🚀 预览环境已部署

项目 详情
PR号 #714
预览链接 https://pr-714.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #714 | | 预览链接 | [https://pr-714.preview.xiaoxiajianji.com](https://pr-714.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-07-22 14:51:02 +08:00
fix(ci): auto-fix lint/format issues
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 59s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m1s
AI Code Review / AI Code Review (pull_request) Successful in 8m38s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 23m9s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Has been skipped
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 26s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Successful in 47s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m19s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
976f01a7c3
auto-approve-bot approved these changes 2026-07-22 15:20:47 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-07-22 15:20:47 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
Collaborator

代码审查结果 - PR #714

⚠️ 问题(1个需要修改)

  1. tests/unit/test_url_security.py (TestTrustedDomains 类):在测试中直接修改模块全局变量 TRUSTED_DOMAINS 并使用 try...finally 手动还原。
    • 问题描述:直接修改 mod.TRUSTED_DOMAINS 会改变模块的全局状态。虽然使用了 try...finally 进行还原,但在 Pytest 环境下(特别是使用 pytest-xdist 并行执行时)这种方式是不安全的,容易导致测试状态污染和不可复现的测试失败。此外,这不是 Pytest 的推荐做法。
    • 修改建议:使用 Pytest 提供的 monkeypatch fixture 来安全地修改属性或环境变量,它会自动处理作用域和还原。例如:monkeypatch.setattr("packages.shared.url_security.TRUSTED_DOMAINS", {"example.com"})

💡 建议(2个可选)

  1. tests/unit/test_url_security.py (TestValidateUrlSafetyBasics 类)test_uppercase_scheme_normalized 测试用例的断言可能存在风险。
    • 具体内容:测试用例断言 assert result == url,假设输入 HTTPS://... 会被原样返回。然而,URL 解析库(如 urllib.parse)在处理或规范化 URL 时,通常会自动将 scheme 转换为小写。如果 validate_url_safety 内部使用了此类库并返回了处理后的对象,该测试将会失败。建议确认被测函数的实现行为,如果它会规范化 URL,测试断言应相应调整(例如断言 result 为小写)。
  2. tests/unit/test_url_security.py (TestInternalHostnameProtection 类)test_public_ip_ok 依赖隐式的全局配置。
    • 具体内容:该测试断言公网 IP(8.8.8.8)会被拦截,这依赖于 url_security 模块中 ALLOW_DIRECT_IP 的默认配置为 False。如果源代码的默认配置变更或受环境变量影响,此测试会变得不稳定。建议在测试中显式 mock 或设置该配置项,以确保测试的独立性和明确性。

格式检查通过 | 逻辑审查需修改 | 性能良好


🤖 由 AI 代码审查机器人自动生成 | 2026-07-22 15:28:19 | 模型:

## 代码审查结果 - PR #714 ### ⚠️ 问题(1个需要修改) 1. **tests/unit/test_url_security.py (TestTrustedDomains 类)**:在测试中直接修改模块全局变量 `TRUSTED_DOMAINS` 并使用 `try...finally` 手动还原。 - **问题描述**:直接修改 `mod.TRUSTED_DOMAINS` 会改变模块的全局状态。虽然使用了 `try...finally` 进行还原,但在 Pytest 环境下(特别是使用 `pytest-xdist` 并行执行时)这种方式是不安全的,容易导致测试状态污染和不可复现的测试失败。此外,这不是 Pytest 的推荐做法。 - **修改建议**:使用 Pytest 提供的 `monkeypatch` fixture 来安全地修改属性或环境变量,它会自动处理作用域和还原。例如:`monkeypatch.setattr("packages.shared.url_security.TRUSTED_DOMAINS", {"example.com"})`。 ### 💡 建议(2个可选) 1. **tests/unit/test_url_security.py (TestValidateUrlSafetyBasics 类)**:`test_uppercase_scheme_normalized` 测试用例的断言可能存在风险。 - **具体内容**:测试用例断言 `assert result == url`,假设输入 `HTTPS://...` 会被原样返回。然而,URL 解析库(如 `urllib.parse`)在处理或规范化 URL 时,通常会自动将 scheme 转换为小写。如果 `validate_url_safety` 内部使用了此类库并返回了处理后的对象,该测试将会失败。建议确认被测函数的实现行为,如果它会规范化 URL,测试断言应相应调整(例如断言 result 为小写)。 2. **tests/unit/test_url_security.py (TestInternalHostnameProtection 类)**:`test_public_ip_ok` 依赖隐式的全局配置。 - **具体内容**:该测试断言公网 IP(8.8.8.8)会被拦截,这依赖于 `url_security` 模块中 `ALLOW_DIRECT_IP` 的默认配置为 `False`。如果源代码的默认配置变更或受环境变量影响,此测试会变得不稳定。建议在测试中显式 mock 或设置该配置项,以确保测试的独立性和明确性。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能良好 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-22 15:28:19 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot merged commit a7a1a6395b into develop 2026-07-22 15:43:21 +08:00
auto-approve-bot deleted branch test/p3-1-wave10-url-security-tests 2026-07-22 15:43:21 +08:00

🗑️ 预览环境已清理

PR #714 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #714 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.