test(wave139): url_security domain 层 +86 单测 #1056

Merged
xiaoxia merged 1 commits from test/wave139-url-security into develop 2026-07-28 16:19:10 +08:00
Owner

变更内容

packages/domain/url_security.py 新增 86 个单测,SSRF 安全校验全覆盖,0 网络依赖。

覆盖范围

函数 数量
常量与异常类 6
check_internal_hostname 12
is_trusted_domain 7
check_ssrf_ip 9
is_ip_address 5
validate_url_basic 16
is_url_basic_safe 5
validate_magic_number 20
合计 86

覆盖场景

  • IP SSRF:回环 / 私有 / 链路本地 / 组播 / 未指定 / 保留地址,IPv4+IPv6
  • 主机名拦截:localhost / metadata / 169.254.169.254 / .local / .internal / .localdomain
  • URL 校验:scheme 白名单 / 端口白名单 / 长度限制 / 缺失主机名 / 直接IP开关 / 可信域名
  • 魔数校验:JPEG / PNG / GIF / WAV / MP3(ID3+sync) / OGG / FLAC / WebP / BMP / MP4
  • 边界:空字节 / 过短 / 未知 MIME / 大小写不敏感 / 子域名匹配

验证

  • pytest: 86 passed
  • black 格式化通过
## 变更内容 为 `packages/domain/url_security.py` 新增 86 个单测,SSRF 安全校验全覆盖,0 网络依赖。 ### 覆盖范围 | 函数 | 数量 | |------|------| | 常量与异常类 | 6 | | check_internal_hostname | 12 | | is_trusted_domain | 7 | | check_ssrf_ip | 9 | | is_ip_address | 5 | | validate_url_basic | 16 | | is_url_basic_safe | 5 | | validate_magic_number | 20 | | **合计** | **86** | ### 覆盖场景 - **IP SSRF**:回环 / 私有 / 链路本地 / 组播 / 未指定 / 保留地址,IPv4+IPv6 - **主机名拦截**:localhost / metadata / 169.254.169.254 / .local / .internal / .localdomain - **URL 校验**:scheme 白名单 / 端口白名单 / 长度限制 / 缺失主机名 / 直接IP开关 / 可信域名 - **魔数校验**:JPEG / PNG / GIF / WAV / MP3(ID3+sync) / OGG / FLAC / WebP / BMP / MP4 - **边界**:空字节 / 过短 / 未知 MIME / 大小写不敏感 / 子域名匹配 ### 验证 - pytest: 86 passed - black 格式化通过

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1056 | | 预览链接 | [https://pr-1056.preview.xiaoxiajianji.com](https://pr-1056.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:否
  • 阻塞级问题数量:0 个

📊 审查概览

  • 整体评价:通过
  • 建议级问题数量:1 个

🔴 阻塞级问题(必须修复)

💡 改进建议(不阻塞合并)

  1. [tests/unit/domain/test_url_security.py: 359] 测试用例命名与实现不完全匹配
    • 具体内容:方法 test_none_url_not_passed_as_str 的命名暗示测试 None 值作为 URL 的情况,但实际代码仅测试了空字符串 ""。虽然注释中说明了“这里只测空字符串”,但为了测试覆盖的完整性,建议增加对 None 输入的显式测试,以验证 validate_url_basic 在接收 None 时是否能正确抛出 UrlSecurityErrorTypeError,避免潜在的运行时错误。

良好实践

  1. 测试覆盖全面:测试用例覆盖了 SSRF 防护(内网 IP、回环地址、元数据服务)、主机名校验(localhost、后缀)、端口限制、协议校验以及文件魔数校验,边界条件(空值、超长、非法字符)考虑周全。
  2. 安全意识强:针对 javascript: 伪协议、云元数据 IP (169.254.169.254) 等高危场景均有专门的测试用例,符合安全编码规范。
  3. 可读性高:使用了清晰的类分组和详细的 docstring,测试意图一目了然。

格式检查通过 | 逻辑审查通过 | 性能无明显问题


🤖 由 AI 代码审查机器人自动生成 | 2026-07-28 02:24:53 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:1 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[tests/unit/domain/test_url_security.py: 359] 测试用例命名与实现不完全匹配** - 具体内容:方法 `test_none_url_not_passed_as_str` 的命名暗示测试 `None` 值作为 URL 的情况,但实际代码仅测试了空字符串 `""`。虽然注释中说明了“这里只测空字符串”,但为了测试覆盖的完整性,建议增加对 `None` 输入的显式测试,以验证 `validate_url_basic` 在接收 `None` 时是否能正确抛出 `UrlSecurityError` 或 `TypeError`,避免潜在的运行时错误。 ### ✅ 良好实践 1. **测试覆盖全面**:测试用例覆盖了 SSRF 防护(内网 IP、回环地址、元数据服务)、主机名校验(localhost、后缀)、端口限制、协议校验以及文件魔数校验,边界条件(空值、超长、非法字符)考虑周全。 2. **安全意识强**:针对 `javascript:` 伪协议、云元数据 IP (`169.254.169.254`) 等高危场景均有专门的测试用例,符合安全编码规范。 3. **可读性高**:使用了清晰的类分组和详细的 docstring,测试意图一目了然。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能无明显问题 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-28 02:24:53 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia reviewed 2026-07-28 16:04:05 +08:00
xiaoxia left a comment
Author
Owner

CI 修复后自动审批

CI 修复后自动审批
xiaoxia added 1 commit 2026-07-28 16:06:04 +08:00
test(wave139): url_security domain 层 +86 单测
CI/CD Pipeline / Staging E2E Tests (pull_request) Blocked by required conditions
CI/CD Pipeline / Staging API Integration Tests (pull_request) Blocked by required conditions
CI/CD Pipeline / Deploy Production (pull_request) Blocked by required conditions
CI/CD Pipeline / Production Browser E2E (pull_request) Blocked by required conditions
CI/CD Pipeline / ACR Image Cleanup (pull_request) Blocked by required conditions
CI/CD Pipeline / Canary Release to Production (pull_request) Blocked by required conditions
Preview Cleanup / Cleanup Preview Environment (pull_request) Waiting to run
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 6s
CI/CD Pipeline / Unit Tests (pull_request) Waiting to run
CI/CD Pipeline / Frontend Unit Tests (pull_request) Waiting to run
CI/CD Pipeline / Build Production API Image (pull_request) Waiting to run
CI/CD Pipeline / Build Production Web Image (pull_request) Waiting to run
CI/CD Pipeline / Build Production Worker Image (pull_request) Waiting to run
CI/CD Pipeline / CI Gate (pull_request) Blocked by required conditions
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 42s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Waiting to run
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m26s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m26s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m58s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m44s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 3m35s
CI/CD Pipeline / Integration Tests (pull_request) Waiting to run
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m49s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 6m26s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m30s
AI Code Review / AI Code Review (pull_request) Successful in 6m53s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 47m11s
87a3351aba
为 domain/url_security.py 新增 86 个单测,SSRF 安全校验全覆盖:

- 常量与异常类:6 个
- check_internal_hostname 内部主机名拦截:12 个
- is_trusted_domain 可信域名匹配:7 个
- check_ssrf_ip IP SSRF 检查:9 个
- is_ip_address IP 判断:5 个
- validate_url_basic URL 基础校验:16 个
- is_url_basic_safe 便捷函数:5 个
- validate_magic_number 魔数校验:20 个

覆盖场景:
- 回环/私有/链路本地/组播/未指定/保留 IP 拦截
- .local/.internal/.localdomain 内网域名后缀拦截
- localhost/metadata 等敏感主机名拦截
- scheme 白名单 / 端口白名单 / URL 长度限制
- 直接 IP 访问开关 + 可信域名白名单(含子域名)
- 9 种文件格式魔数校验(图片/音频/视频)
- 空字节 / 过短 / 未知 MIME 等边界情况
xiaoxia force-pushed test/wave139-url-security from 6f5382e675 to 87a3351aba 2026-07-28 16:06:04 +08:00 Compare
xiaoxia merged commit a863324942 into develop 2026-07-28 16:19:10 +08:00
Sign in to join this conversation.