fix(security): 代码审查 — 修复 9 个安全/稳定性 bug #2

Merged
feibisi merged 2 commits from fix/code-review-security-bugs into main 2026-03-18 16:05:28 +08:00
Owner

概述

代码审查发现并修复了 9 个 bug,涵盖 3 个致命、5 个高危和 1 个安全漏洞。

修复清单

CRITICAL

# 文件 问题
1 BridgeManager.php enable_bridge() 引用未定义变量 $gpl_result,PHP 8 下致命错误
2 AdminPage.php ajax_generate_api_key() catch 块缺 return,异常后可能写入空 key
3 BridgeManager.php new VendorManager() 绕过单例,导致供应商状态不同步

HIGH

# 文件 问题
4 SubscriptionManager.php wc_am_product_list() 返回 null 时数组访问 TypeError
5 GiteeHandler.php token 同时在 URL 和 Header 中发送,URL 泄露凭据
6 SourceResolver.php convert_source() 未检查已加密数据,导致双重加密
7 AdminPage/VendorAdmin/Plugin 106 处 wp_send_json_error() 后缺 return
8 BridgeClient.php get_download_url() 不检查空 server_url

SECURITY

# 文件 问题
9 BackupManager.php extract_zip() 无 Zip Slip 防护,恶意归档可写任意路径

测试

  • PHP 语法检查:includes/ 全部通过
  • 安全回归测试:12/12 通过(含 Zip Slip 验证)
  • wpcy.com 线上部署测试:功能正常

影响范围

9 个文件,+173 / -36 行

## 概述 代码审查发现并修复了 9 个 bug,涵盖 3 个致命、5 个高危和 1 个安全漏洞。 ## 修复清单 ### CRITICAL | # | 文件 | 问题 | |---|------|------| | 1 | `BridgeManager.php` | `enable_bridge()` 引用未定义变量 `$gpl_result`,PHP 8 下致命错误 | | 2 | `AdminPage.php` | `ajax_generate_api_key()` catch 块缺 return,异常后可能写入空 key | | 3 | `BridgeManager.php` | `new VendorManager()` 绕过单例,导致供应商状态不同步 | ### HIGH | # | 文件 | 问题 | |---|------|------| | 4 | `SubscriptionManager.php` | `wc_am_product_list()` 返回 null 时数组访问 TypeError | | 5 | `GiteeHandler.php` | token 同时在 URL 和 Header 中发送,URL 泄露凭据 | | 6 | `SourceResolver.php` | `convert_source()` 未检查已加密数据,导致双重加密 | | 7 | `AdminPage/VendorAdmin/Plugin` | 106 处 `wp_send_json_error()` 后缺 return | | 8 | `BridgeClient.php` | `get_download_url()` 不检查空 `server_url` | ### SECURITY | # | 文件 | 问题 | |---|------|------| | 9 | `BackupManager.php` | `extract_zip()` 无 Zip Slip 防护,恶意归档可写任意路径 | ## 测试 - PHP 语法检查:`includes/` 全部通过 - 安全回归测试:12/12 通过(含 Zip Slip 验证) - wpcy.com 线上部署测试:功能正常 ## 影响范围 9 个文件,+173 / -36 行
feibisi added 2 commits 2026-03-18 15:49:33 +08:00
CRITICAL:
- BridgeManager::enable_bridge() 移除 orphaned $gpl_result 引用(致命错误)
- AdminPage::ajax_generate_api_key() catch 块补 return 防止空 key 写入
- BridgeManager 改用 VendorManager::get_instance() 避免双实例状态不同步

HIGH:
- SubscriptionManager::resolve_subscription() 加 is_array() null 防护
- GiteeHandler 移除 URL 中的 access_token,仅通过 Authorization header 发送
- SourceResolver::convert_source() 加 is_encrypted() 检查防止双重加密
- AdminPage/VendorAdmin/Plugin 共 106 处 wp_send_json_error() 后补 return
- BridgeClient::get_download_url() 加空 server_url 检查

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
解压前逐条检查 zip 条目路径,拒绝包含 ../ 遍历的恶意归档,
防止文件被写到目标目录之外。安全回归测试 12/12 通过。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feibisi merged commit f9ec038b2e into main 2026-03-18 16:05:28 +08:00
feibisi deleted branch fix/code-review-security-bugs 2026-03-18 16:05:28 +08:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: WenPai-org/wpbridge#2
No description provided.