|
721
|
21
|
324
|
1
|
|
0
|
测试
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786339342
|
1786339349
|
1786339349
|
0
|
0
|
0
|
Edit
Delete
|
|
722
|
21
|
325
|
1
|
|
0
|
测试
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786339360
|
1786339366
|
1786339366
|
0
|
0
|
0
|
Edit
Delete
|
|
738
|
21
|
326
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786672642
|
1786672648
|
1786672648
|
0
|
0
|
0
|
Edit
Delete
|
|
739
|
21
|
327
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786672660
|
1786672666
|
1786672666
|
0
|
0
|
0
|
Edit
Delete
|
|
740
|
21
|
328
|
1
|
|
0
|
Merge pull request '套餐购买页“购买时长"页签根据后台设置显隐& Merge pull request '套餐购买页“购买时长"页签根据后台设置显隐' (#321) from pay into pay-260818...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786672685
|
1786672694
|
1786672694
|
0
|
0
|
0
|
Edit
Delete
|
|
744
|
21
|
329
|
1
|
|
0
|
美团包型库存同步
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1787555151
|
1787555158
|
1787555158
|
0
|
0
|
0
|
Edit
Delete
|
|
745
|
21
|
330
|
1
|
|
0
|
美团包型库存同步
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1787555173
|
1787555181
|
1787555181
|
0
|
0
|
0
|
Edit
Delete
|
|
746
|
21
|
331
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1787639582
|
1787639588
|
1787639588
|
0
|
0
|
0
|
Edit
Delete
|
|
747
|
21
|
332
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1787639604
|
1787639610
|
1787639610
|
0
|
0
|
0
|
Edit
Delete
|
|
763
|
21
|
333
|
1
|
|
0
|
需求 分账
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1788242773
|
1788242779
|
1788242779
|
0
|
0
|
0
|
Edit
Delete
|
|
764
|
21
|
334
|
1
|
|
0
|
需求 分账
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1788242824
|
1788242831
|
1788242831
|
0
|
0
|
0
|
Edit
Delete
|
|
778
|
21
|
335
|
1
|
|
0
|
包厢续费小程序码
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789436449
|
1789436456
|
1789436456
|
0
|
0
|
0
|
Edit
Delete
|
|
779
|
21
|
336
|
1
|
|
0
|
包厢续费小程序码
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789436483
|
1789436492
|
1789436492
|
0
|
0
|
0
|
Edit
Delete
|
|
782
|
21
|
337
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789441207
|
1789441214
|
1789441214
|
0
|
0
|
0
|
Edit
Delete
|
|
783
|
21
|
338
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789441226
|
1789441236
|
1789441236
|
0
|
0
|
0
|
Edit
Delete
|
|
786
|
21
|
339
|
1
|
|
0
|
需求 麦霸直播间不判断配置
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789718159
|
1789718167
|
1789718167
|
0
|
0
|
0
|
Edit
Delete
|
|
795
|
21
|
340
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1790069822
|
1790069834
|
1790069834
|
0
|
0
|
0
|
Edit
Delete
|
|
796
|
21
|
341
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1790069854
|
1790069874
|
1790069874
|
0
|
0
|
0
|
Edit
Delete
|
|
831
|
21
|
342
|
1
|
|
0
|
包厢安全信息二维码
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791883266
|
1791883284
|
1791883284
|
0
|
0
|
0
|
Edit
Delete
|
|
832
|
21
|
343
|
1
|
|
0
|
包厢安全信息二维码
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791883297
|
1791883305
|
1791883305
|
0
|
0
|
0
|
Edit
Delete
|
|
833
|
21
|
344
|
1
|
|
0
|
营业时间盘点单
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1792057288
|
1792057294
|
1792057294
|
0
|
0
|
0
|
Edit
Delete
|
|
834
|
21
|
345
|
1
|
|
0
|
包厢安全信息二维码
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1792057321
|
1792057332
|
1792057332
|
0
|
0
|
0
|
Edit
Delete
|
|
837
|
21
|
346
|
1
|
|
0
|
其他 兼容方法变更
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1792377221
|
1792377227
|
1792377227
|
0
|
0
|
0
|
Edit
Delete
|
|
838
|
21
|
347
|
1
|
|
0
|
其他 兼容方法变更
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1792377236
|
1792377247
|
1792377247
|
0
|
0
|
0
|
Edit
Delete
|
|
839
|
21
|
348
|
1
|
|
0
|
修复美团预订核销bug
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1792393336
|
1792393342
|
1792393342
|
0
|
0
|
0
|
Edit
Delete
|
|
840
|
21
|
349
|
1
|
|
0
|
修复美团预订核销bug
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1792393351
|
1792393357
|
1792393357
|
0
|
0
|
0
|
Edit
Delete
|
|
869
|
21
|
350
|
1
|
|
0
|
有开启重置二维码的。
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793164924
|
1793164947
|
1793164947
|
0
|
0
|
0
|
Edit
Delete
|
|
874
|
21
|
351
|
1
|
|
0
|
h5项目验收工单
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793330937
|
1793330942
|
1793330942
|
0
|
0
|
0
|
Edit
Delete
|
|
875
|
21
|
352
|
1
|
|
0
|
h5项目验收工单
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793330953
|
1793330958
|
1793330958
|
0
|
0
|
0
|
Edit
Delete
|
|
880
|
21
|
353
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793339813
|
1793339824
|
1793339824
|
0
|
0
|
0
|
Edit
Delete
|
|
895
|
21
|
354
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793863976
|
1793863983
|
1793863983
|
0
|
0
|
0
|
Edit
Delete
|
|
896
|
21
|
355
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793864000
|
1793864006
|
1793864006
|
0
|
0
|
0
|
Edit
Delete
|
|
903
|
21
|
356
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793871747
|
1793871752
|
1793871752
|
0
|
0
|
0
|
Edit
Delete
|
|
904
|
21
|
357
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793871761
|
1793871766
|
1793871766
|
0
|
0
|
0
|
Edit
Delete
|
|
119
|
22
|
1
|
1
|
|
0
|
🔍 代码审查报告:app - test commit
|
## 自动代码审查报告
**分支**: app
**提交**: `307f42502802fe04 ## 自动代码审查报告
**分支**: app
**提交**: `307f42502802fe04392911ad1265e45098baace5`
**提交人**: test ()
**时间**: 2026-05-12 16:00:21
---
## 1. 审查摘要
- **代码质量评分**:5/10
- **总体评价**:该文件为典型的 CodeIgniter 3.x 入口引导文件(`index.php`),整体结构可运行,但存在较多历史遗留写法。代码在入口阶段直接操作超全局变量、硬编码敏感配置、未经验证解析请求体,且通过篡改 `$_SERVER['REQUEST_URI']` 实现动态路由,违背了现代 PHP 框架的“入口纯净”与“配置分离”原则。虽非直接高危漏洞,但存在路由污染、内存隐患与多环境部署困难等中等级别风险。
- **风险等级**:🟠 中
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `index.php` 顶部 ~L10-L15 | 直接使用 `$_SERVER['PHP_SELF']` 进行正则匹配并定义全局常量。该变量受客户端控制,未做清洗可能导致非预期常量覆盖或路由污染。 | 使用 `parse_url()` 提取安全路径,并增加白名单/格式校验,避免直接依赖 `PHP_SELF`。 | `$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);<br>if (preg_match('/^\/app-(\w+)\//', $path, $m)) {<br> define('BRANCHNAME', 'app-'.$m[1]);<br>}` |
| 🔴 严重 | `index.php` 底部 ~L140-L155 | 通过 `str_replace` 直接修改 `$_SERVER['REQUEST_URI']` 实现动态路由。此操作绕过 CI 原生 Router 解析,且 `str_replace` 会替换 URI 中所有匹配项,易引发路由冲突或安全绕过。 | 废弃 URI 篡改方案。改用 CI 的 `application/config/routes.php` 配置通配符路由,或通过 `pre_system` Hook 动态指定控制器。 | 在 `routes.php` 中配置:<br>`$route['merchantAppServer/(:any)'] = 'merchantAppServer/index/$1';` |
| 🔴 严重 | `index.php` 底部 ~L145 | `require_once` 加载 `routes_method.php` 前未校验文件是否存在。若文件缺失或权限错误,将直接抛出 `Fatal Error` 导致服务不可用。 | 增加 `file_exists()` 判断,或使用 `include` 配合降级逻辑。 | `if (file_exists(APPPATH.'config/routes_method.php')) {<br> $routerMethod = include APPPATH.'config/routes_method.php';<br>} else {<br> $routerMethod = [];<br>}` |
| 🟠 警告 | `index.php` 底部 ~L140 | 在入口文件对匹配请求无条件执行 `file_get_contents('php://input')`。若请求体过大(如文件上传/大 JSON),易引发内存溢出,且阻塞后续流程。 | 限制读取大小,或仅在明确需要解析 JSON 的 API 路由中读取。 | `$input = file_get_contents('php://input', false, null, 0, 1024*1024); // 限制 1MB` |
| 🟠 警告 | `index.php` 底部 ~L142 | `json_decode` 未校验返回值类型与错误码。若 JSON 格式错误返回 `null`,后续数组访问虽用 `??` 但缺乏结构化校验,逻辑脆弱。 | 增加 `json_last_error() === JSON_ERROR_NONE` 校验,确保数据结构符合预期。 | `$data = json_decode($input, true);<br>if (json_last_error() !== JSON_ERROR_NONE || !is_array($data)) {<br> // 记录日志或返回默认路由<br>}` |
| 🟠 警告 | `index.php` 中部 ~L20-L30 | 硬编码敏感业务 ID(商户号、AppID)及服务器绝对路径(`/mnt/data/www/...`)。违反配置与代码分离原则,不利于多环境部署与密钥管理。 | 移至 `application/config/config.php` 或 `.env` 环境变量,通过 `$this->config->item()` 读取。 | `// config.php`<br>`$config['default_mch_id'] = '1495488662';` |
| 🟡 建议 | `index.php` 顶部 ~L10 | `isset($preg_url[1]) && !empty($preg_url[1])` 逻辑冗余。`!empty()` 已包含 `isset()` 检查,且正则匹配成功时 `$preg_url[1]` 必存在。 | 简化条件判断,提升代码可读性。 | `if (!empty($preg_url[1])) { ... }` |
| 🟡 建议 | 全局 | 代码实际基于 **CodeIgniter 3.x** 架构,非 phpci。大量自定义逻辑耦合在入口文件,不符合框架生命周期规范。 | 保持 `index.php` 仅负责路径解析与引导加载。业务路由、常量、路径配置应迁移至框架标准位置。 | 参考 CI3 官方 `index.php` 模板,仅保留 `$system_path`、`$application_folder` 解析及 `require_once BASEPATH.'core/CodeIgniter.php';` |
> 💡 **框架适配说明**:您提及的 `phpci` 框架在代码中未体现,当前文件为标准的 CodeIgniter 3.x 入口文件。若项目确为 phpci,请核对入口文件路径;若为 CI3,建议查阅 [CodeIgniter 3 用户指南 - 路由与配置](https://codeigniter.com/user_guide/general/routing.html) 以规范动态路由实现。
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **移除 `$_SERVER['REQUEST_URI']` 直接篡改逻辑**:改用 CI 原生路由机制或 `pre_system` Hook,避免路由冲突与安全绕过风险。
2. **增加 `routes_method.php` 存在性校验**:防止文件缺失导致 `Fatal Error` 中断服务。
3. **加固 `php://input` 解析流程**:限制读取大小、校验 JSON 格式与数据结构,防止内存泄漏与解析异常。
### 🛠 后续重构与优化方向
1. **配置外置与环境隔离**:将所有硬编码的域名、支付 ID、绝对路径迁移至 `application/config/config.php` 或 `.env` 文件,支持 `development`/`production` 多环境自动切换。
2. **路由规范化**:废弃入口文件内的正则匹配与 URI 替换。若需根据请求体动态分发,建议在 Controller 层或自定义 Middleware/Hook 中处理,保持入口文件纯净。
3. **安全基线加固**:
- 对 `$_SERVER` 变量使用 `filter_input(INPUT_SERVER, 'REQUEST_URI')` 或 `parse_url()` 清洗。
- 敏感操作(如动态路由解析)增加审计日志,便于追踪异常请求。
4. **代码规范现代化**:统一注释语言,遵循 PSR-12 缩进与命名规范;清理未使用的常量(如 `DEBUG_CI`、`FACILITATOR`),魔法数字应提取为具名常量或配置项。
5. **框架演进评估**:当前架构为 CI3,若项目允许,建议评估迁移至 CI4 或现代框架(如 Laravel/Symfony),以获得更好的路由、配置管理、安全组件与 PHP 8+ 兼容性支持。
如需针对动态路由 Hook 实现或配置外置提供具体代码模板,可提供当前路由分发需求,我将为您输出可直接集成的重构方案。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1778572821
|
1778572821
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
120
|
22
|
2
|
1
|
|
0
|
🔍 代码审查报告:app-260519 - 提交测试钩子。
|
## 自动代码审查报告
**分支**: app-260519
**提交**: `341c6d8dc ## 自动代码审查报告
**分支**: app-260519
**提交**: `341c6d8dc2b8ad1e55d1ca9fe910dd810534c47d`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-12 16:05:04
---
## 1. 审查摘要
- **代码质量评分**:3/10
- **总体评价**:当前代码为独立调试脚本形态,存在多处致命逻辑阻断(`exit` 导致后续代码不可达)、cURL 资源泄漏风险、硬编码 HTTP 明文传输等高危问题。代码未遵循 PSR-12 规范,缺乏类型声明与异常安全设计,且未融入目标框架的 MVC/组件化架构。若直接投入生产环境,将导致功能失效、数据泄露及服务器句柄耗尽。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `t.php:2,4` | **逻辑阻断/死代码**:脚本开头连续使用 `exit;`,导致后续所有函数定义、数据构造及业务调用均无法执行。 | 移除所有调试用的 `echo` 与 `exit`,确保代码按预期流程执行。若需保留调试逻辑,应通过环境变量或配置开关控制。 | `// 删除 echo "test21"; exit; 及后续 exit;` |
| 🔴 严重 | `t.php:10-38` | **cURL 句柄泄漏**:`throw new Exception()` 会中断执行流,跳过底部的 `curl_close($curl)`,长期运行将耗尽系统文件描述符。 | 使用 `try...finally` 结构确保无论是否抛出异常,cURL 资源均被正确释放。 | `try { $reponse = curl_exec($curl); /* 校验逻辑 */ } finally { curl_close($curl); }` |
| 🔴 严重 | `t.php:45` | **敏感数据明文传输**:支付/业务回调接口使用 `http://` 协议,未启用 TLS 加密,极易遭受中间人攻击与数据篡改。 | 强制升级为 `https://`,并在 cURL 中配置证书验证(`CURLOPT_SSL_VERIFYPEER` / `CURLOPT_SSL_VERIFYHOST`)。 | `$post_url = "https://pre-pay.g-hi.com/...";` |
| 🟠 警告 | `t.php:15,18,21` | **cURL 选项配置不规范**:`CURLOPT_POST` 应接收布尔值或 `1`,传入 `'2'`、`'3'` 属于未定义行为。POST 类型应由 `CURLOPT_POSTFIELDS` 格式与 Header 决定。 | 统一设置 `curl_setopt($curl, CURLOPT_POST, true);`,根据 `$posttype` 仅处理数据序列化与 Header。 | `curl_setopt($curl, CURLOPT_POST, true);`<br>`if ($posttype == '2') curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($jsondata));` |
| 🟠 警告 | `t.php:19` | **冗余且易错的 Header**:手动计算并设置 `Content-Length` 容易因编码问题导致长度不匹配,cURL 底层会自动计算。 | 移除 `'Content-Length: ' . strlen($jsondata)`,交由 cURL 自动处理。 | `curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/json; charset=utf-8']);` |
| 🟡 建议 | `t.php:全文件` | **违反 PSR-12 与框架规范**:缩进混用(Tab/Space)、全局函数定义、无类型声明、注释乱码(`첽֪ͨ`)。在框架项目中应封装为 Controller/Service 类。 | 遵循 PSR-12,添加 `declare(strict_types=1);`、参数/返回值类型提示,将逻辑迁移至框架的 `application/controllers/` 或 `libraries/`。 | 见下方重构示例 |
| 🟡 建议 | `t.php:10` | **变量命名拼写错误**:`$check_reponse` 拼写错误,降低可读性。 | 修正为 `$check_response`。 | `function curlRequest(..., bool $check_response = true)` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **清除死代码**:立即移除顶部的 `exit;` 调试语句,恢复业务逻辑执行流。
2. **修复资源泄漏**:将 `curlRequest` 改造为 `try...finally` 结构,确保 `curl_close()` 必执行。
3. **升级传输协议**:将接口地址改为 `https://`,并补充 SSL 验证配置,避免支付/业务数据裸奔。
4. **修正 cURL 配置**:统一 `CURLOPT_POST` 为 `true`,移除手动 `Content-Length`,避免底层协议栈异常。
### 🛠 后续重构与优化方向
1. **框架化集成**:
> *注:根据提供的项目目录结构(`system/libraries`, `system/database` 等),该架构高度吻合 **CodeIgniter 3**。若 `phpci` 为内部定制框架,请结合其官方文档调整。*
- 建议将 `curlRequest` 封装为独立 Library(如 `application/libraries/Http_client.php`)或 Service 类,避免全局函数污染命名空间。
- 在 CI 框架中,推荐优先使用官方 `curl` 扩展或引入现代 HTTP 客户端(如 `GuzzleHttp`),以获得更好的连接池管理、重试机制与 PSR-7 兼容性。
2. **代码规范与类型安全**:
- 启用严格模式 `declare(strict_types=1);`。
- 为函数添加类型声明(PHP 7.4+ 推荐):
```php
function curlRequest(string $url, int $postType = 1, ?string $jsonData = null, int $timeout = 0, bool $checkResponse = true): string
```
- 统一使用 UTF-8 编码,修复注释乱码,补充完整的 PHPDoc 块。
3. **健壮性增强**:
- 增加请求重试机制(如指数退避)。
- 对 `$jsondata` 进行 `json_encode` 前的有效性校验(`JSON_THROW_ON_ERROR`)。
- 若用于生产环境,建议将敏感配置(URL、超时、密钥)抽离至 `config.php` 或环境变量,禁止硬编码。
> 💡 **局限性说明**:当前提交仅为单文件调试脚本,未包含路由、控制器入口、配置加载及依赖注入上下文。若需进行完整的架构级审查,请提供完整的 Controller/Model 调用链及框架配置文件。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1778573104
|
1778573104
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
143
|
22
|
3
|
1
|
|
0
|
🔍 代码审查报告:app-260519 - 0519
|
## 自动代码审查报告
**分支**: app-260519
**提交**: `b8292b8a8 ## 自动代码审查报告
**分支**: app-260519
**提交**: `b8292b8a832fb77ffc57d9ed036a5b2f6eced983`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-18 17:53:43
---
## 1. 审查摘要
- **代码质量评分**:4.5 / 10 分
- **总体评价**:代码实现了较为完整的商家端业务逻辑与支付回调流程,但存在大量历史遗留问题。核心隐患集中在**敏感信息硬编码**、**PHP 8 兼容性断裂**、**密码明文处理**以及**控制器职责过重**。Redis 辅助函数设计存在性能瓶颈与并发风险,部分测试代码未清理即上线。整体可维护性与安全性亟待重构。
- **风险等级**:🔴 高
> 📌 **框架说明**:代码结构、加载方式(`$this->load->`、`BASEPATH`、`CI_DB`)高度符合 **CodeIgniter 3.x** 规范。若 `phpci` 为贵司内部定制框架,请结合其官方文档对底层组件加载方式做适配调整。以下建议基于标准 PHP 7.4+/8.x 及 CI3 最佳实践。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `common_helper.php` (多处) | **敏感密钥硬编码**:阿里云 AK/SK 及科大讯飞 API 密钥直接写在代码中,极易通过版本库泄露,导致云资源被盗刷。 | 立即迁移至配置文件(如 `config/aliyun.php`)或环境变量,通过 `$this->config->item()` 或 `$_ENV` 读取。 | `$ak = getenv('ALIYUN_ACCESS_KEY_ID') ?: $this->config->item('aliyun_ak');` |
| 🔴 严重 | `common_helper.php` (~L1050) | `decodeUnicode` 使用已废弃的 `create_function`,**PHP 8.0+ 将直接抛出 Fatal Error 导致服务崩溃**。 | 替换为现代匿名函数(Closure)。 | `return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', function($m){ return mb_convert_encoding(pack("H*", $m[1]), "UTF-8", "UCS-2BE"); }, $str);` |
| 🔴 严重 | `common_helper.php` (~L680) | `rs_hmset` 函数被**重复定义两次**,PHP 解析时会触发 `Fatal error: Cannot redeclare`,直接阻断脚本执行。 | 删除第二个重复的 `if (!function_exists('rs_hmset')) { ... }` 代码块。 | (直接删除重复定义段) |
| 🔴 严重 | `MerchantAppServer.php` (~L450) | 修改打折密码时直接比对明文:`$data['_discount_pwd'] != $_old_password`。违反安全基线,且数据库若泄露将导致批量撞库。 | 密码必须使用 `password_hash()` 存储,验证使用 `password_verify()`。 | `if (!password_verify($_old_password, $data['_discount_pwd'])) { $this->error_response('旧密码不正确'); }` |
| 🔴 严重 | `WxNotify.php` (~L25, ~L55) | `try-catch` 块中 `$notify` 在 `try` 内部实例化。若实例化前抛异常,`catch` 中调用 `$notify->SetReturn_code()` 将触发 `Undefined variable` 错误,导致微信/支付宝收不到标准响应而重复回调。 | 将 `$notify = new WxPayNotify();` 移至 `try` 外部,或在 `catch` 中安全实例化。 | `$notify = new WxPayNotify(); try { ... } catch(Exception $e) { $notify->SetReturn_code("FAIL"); ... }` |
| 🟠 警告 | `MerchantAppServer.php` (~L45) | `__construct` 承载鉴权、配置、DB、时区、日志等逻辑,且 `json_decode` 未做错误处理。若传入非法 JSON,后续数组访问将触发 Warning/Notice 并污染业务流。 | 鉴权逻辑抽离至基类控制器或中间件;增加 JSON 解析校验。 | `$this->stream = json_decode($this->stream, true); if (json_last_error() !== JSON_ERROR_NONE) { $this->error_response('请求参数JSON格式错误'); }` |
| 🟠 警告 | `common_helper.php` (~L580) | Redis 辅助函数每次调用都执行 `connect()` 和 `close()`。高并发下频繁创建/销毁 TCP 连接,极易耗尽文件描述符并引发性能雪崩。 | 使用 CI 内置 Redis 驱动或实现连接池复用,避免手动 `close()`。 | 建议统一使用 `$this->load->driver('cache', ['adapter' => 'redis']);` 管理连接生命周期。 |
| 🟠 警告 | `common_helper.php` (~L630) | `rs_incrByFloat` 使用 `is_float($float)` 校验。PHP 中浮点数常以字符串形式传入(如 `'0.00'`),该判断会直接返回 `false` 导致逻辑失效。 | 改用 `is_numeric()` 进行安全校验。 | `if (!empty($keyName) && is_numeric($float)) { ... }` |
| 🟠 警告 | `WxNotify.php` (~L115) | 支付宝验签公钥硬编码为 `"test"`,且残留 `aliHallNativeNotifytest` 调试方法。线上支付回调将因验签失败而中断,测试代码增加攻击面。 | 从配置读取真实公钥;彻底删除 `test` 后缀方法及双分号等语法瑕疵。 | `$aopClient->alipayPublicKey = $this->config->item('alipay_public_key');` |
| 🟡 建议 | `MerchantAppServer.php` (~L100) | `index()` 方法超 500 行,包含大量 `switch-case` 路由分发。违反单一职责原则(SRP),难以进行单元测试与后续迭代。 | 按业务域拆分至独立 Controller,或使用 CI 路由配置替代手动 `switch`。 | 将 `case '0005'` 移至 `MerchantAppLogin.php`,`case '00063'` 移至 `MerchantAppPrinter.php`。 |
| 🟡 建议 | `Ahead_ai_vending_cabinet_shelf_model.php` (~L180) | `create_qrcode` 使用递归处理批量生成。当未生成码的柜子较多时,易触发 `Maximum function nesting level` 错误。 | 改为 `while` 循环或交由消息队列异步处理。 | `while (!empty($cabinet)) { $cabinet_id = array_shift($cabinet); ... }` |
| 🟡 建议 | 全局 | 存在大量魔法数字(如 `23142`, `0777`, `500000`)及未定义常量(`BRANCHNAME`, `DEBUG_VERSION`)。`@mkdir($dirname, 0777)` 权限过大。 | 提取为类常量或配置文件;日志目录权限改为 `0755`;明确常量定义来源。 | `const MERCHANT_CAMBODIA_ID = 23142;`<br>`@mkdir($dirname, 0755, true);` |
---
## 3. 总结与行动建议
### 🚨 优先修复的关键问题(P0)
1. **移除硬编码密钥**:立即将阿里云 AK/SK、科大讯飞密钥、支付宝公钥迁移至安全配置中心或环境变量,并轮换已泄露的旧密钥。
2. **修复 PHP 8 兼容性**:替换 `create_function`,删除重复的 `rs_hmset` 定义,否则升级 PHP 版本将直接导致服务宕机。
3. **密码安全改造**:废弃明文密码比对逻辑,全面接入 `password_hash()` / `password_verify()` 标准加密方案。
4. **支付回调容错**:修复 `WxNotify.php` 中 `$notify` 变量作用域问题,确保第三方回调始终能收到标准 XML/JSON 响应,避免资金对账异常。
### 🛠 后续重构与优化方向
1. **架构瘦身**:`MerchantAppServer.php` 的 `__construct` 和 `index()` 已演变为“上帝类”。建议引入 **路由分发机制** 或 **中间件** 处理 Token 校验、权限拦截与日志记录,控制器仅保留业务编排逻辑。
2. **Redis 连接治理**:废弃当前每次请求新建连接的 Helper 模式。改用 CI 官方 `Cache` 驱动或 `Predis` 连接池,将 `connect/close` 交由框架生命周期管理,预计可降低 30%~50% 的 I/O 延迟。
3. **异步化改造**:`control_line` 中的 `usleep(500000)` 会阻塞 PHP-FPM 工作进程。建议将硬件控制指令投递至 Redis 队列或 RabbitMQ,由独立 Worker 消费执行,提升接口响应速度。
4. **代码规范对齐**:逐步引入 `PHP_CodeSniffer` 配合 `PSR-12` 规则集进行静态扫描;统一命名规范(类名 `PascalCase`,方法/变量 `camelCase`,常量 `UPPER_SNAKE_CASE`);补充类型声明(Type Hints)以提升 IDE 提示与静态分析能力。
> ⚠️ **局限性说明**:提供的 `MerchantAppServer.php`、`common_helper.php` 及 `Ahead_ai_vending_cabinet_shelf_model.php` 末尾存在代码截断(如 `if (isset($`、`$this-` 等语法未完成)。本次审查基于可见代码片段进行,若截断部分包含核心事务处理或敏感逻辑,请补充完整后再次提交审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779098024
|
1779098024
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
151
|
22
|
4
|
1
|
|
0
|
合并0519
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1779154320
|
1779154430
|
1779154327
|
0
|
0
|
0
|
Edit
Delete
|
|
152
|
22
|
5
|
1
|
|
0
|
合并0519
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1779154358
|
1780972468
|
1779154395
|
0
|
0
|
0
|
Edit
Delete
|
|
153
|
22
|
6
|
1
|
|
0
|
🔍 代码审查报告:app - Merge pull request '合并0519' 🔍 代码审查报告:app - Merge pull request '合并0519' (#4) from app-260519 i...
|
## 自动代码审查报告
**分支**: app
**提交**: `55f6c1b8adab5b8d ## 自动代码审查报告
**分支**: app
**提交**: `55f6c1b8adab5b8d101745d9092207a844881754`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-19 09:33:50
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:代码整体实现了业务需求,路由映射清晰,控制器结构符合传统 MVC 模式。但存在**多处硬编码敏感信息、支付回调异常处理不严谨、Redis 连接滥用、核心登录逻辑臃肿**等问题。部分代码仍停留在早期 PHP 开发习惯,缺乏现代安全规范与性能优化意识。
- **风险等级**:🔴 高(存在敏感信息泄露、支付验签隐患、明文密码比对风险)
> 📌 **框架说明**:经分析,提交代码实际基于 **CodeIgniter 3** 架构(特征:`BASEPATH`、`$this->load->model()`、`$this->db` 等),而非 `phpci`。本次审查将严格遵循 CI3 生命周期规范及现代 PHP 最佳实践进行。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `WxNotify.php` ~L115 | 支付宝公钥硬编码为 `"test"`,生产环境将导致验签失败或资金安全风险 | 将公钥移至配置文件或环境变量,通过 `$this->config->item()` 动态读取 | `$aopClient->alipayPublicKey = $this->config->item('alipay_public_key');` |
| 🔴 严重 | `MerchantAppServer.php` ~L330 | 登录接口直接返回科大讯飞 TTS `APPID`、`APISecret`、`APIKey`,存在严重密钥泄露风险 | 密钥严禁下发至客户端。应改为后端代理请求,或前端仅获取临时签名/Token | 移除 `xfyun_tts_config` 数组,改为独立接口按需签发临时凭证 |
| 🔴 严重 | `WxNotify.php` ~L35 | 微信回调 `try` 块内实例化 `$notify`,若 `WxPayResults::Init` 抛异常,`catch` 中调用 `$notify` 可能触发 `Fatal Error` | 将 `$notify` 实例化移至 `try` 外部,确保异常分支可安全响应微信 | `$notify = new WxPayNotify(); try { ... } catch(Exception $e) { ... }` |
| 🟠 警告 | `MerchantAppServer.php` ~L150 | 登录接口 `index()` 方法超 300 行,混合了权限校验、菜单过滤、配置读取、日志记录等,违反单一职责原则 | 拆分为独立 Service 类(如 `LoginService`、`MenuBuilder`),控制器仅负责调度 | 提取菜单过滤逻辑至 `MenuFilterService::filter($menus, $userType)` |
| 🟠 警告 | `common_helper.php` Redis 函数 | 每个 Redis 辅助函数均独立调用 `get_aliyun_redis_conn()` 并立即 `close()`,高并发下将耗尽连接池并严重拖慢响应 | 使用单例模式或 CI3 内置 Redis 驱动复用连接,避免频繁握手/断开 | 封装 `RedisPool::getInstance()`,或使用 `$this->load->driver('cache', ['adapter' => 'redis'])` |
| 🟠 警告 | `MerchantAppServer.php` ~L200 | 修改经理打折密码使用 `!=` 直接比对 `$data['_discount_pwd']`,若数据库为哈希存储将失效,若为明文则严重违规 | 确认存储格式。若为哈希必须使用 `password_verify()`;严禁明文存储密码 | `if (!password_verify($_old_password, $data['_discount_pwd'])) { $this->error_response('旧密码不正确'); }` |
| 🟡 建议 | `routes_method.php` 多处 | 配置数组中大量使用 `'renark'` 键名,属拼写错误,易导致前端或日志解析异常 | 全局替换为正确的 `'remark'`,保持配置规范一致性 | `'renark' => '...'` → `'remark' => '...'` |
| 🟡 建议 | `AiVendingCabinet.php` ~L135 | `foreach ($data as &$v)` 使用引用遍历修改数组,未 `unset($v)` 可能引发后续数组操作副作用 | 改用键值遍历或 `array_map`,避免引用污染 | `foreach ($data as $k => $v) { $data[$k]['operational_scene_name'] = ...; }` |
| 🟡 建议 | `WxNotify.php` ~L140 | 遗留调试方法 `aliHallNativeNotifytest()` 未清理,暴露于公网可能被恶意调用 | 生产环境应彻底删除或移至 `tests/` 目录,避免成为攻击入口 | 直接移除该方法 |
| 🟡 建议 | `MerchantAppServer.php` ~L115 | 硬编码商家时区逻辑 `if($this->merchant_id==23142)`,缺乏扩展性且难以维护 | 改为从商家配置表读取 `timezone` 字段,支持多时区动态切换 | `$tz = $merchant_config['timezone'] ?? 'Asia/Shanghai'; date_default_timezone_set($tz);` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **敏感信息脱敏**:立即移除 `MerchantAppServer.php` 中下发的讯飞 TTS 密钥,修复 `WxNotify.php` 支付宝测试公钥。此类问题可直接导致业务被黑产利用或支付链路中断。
2. **支付回调健壮性**:规范 `WxNotify.php` 中所有回调方法的异常捕获与作用域管理,确保无论业务逻辑是否成功,均能向微信/支付宝返回标准 XML 响应,避免重复回调或订单状态不一致。
3. **密码安全合规**:核实 `_discount_pwd` 存储方式,强制引入 `password_hash()` / `password_verify()` 机制,杜绝明文比对。
### 🛠 后续重构与优化方向
1. **控制器瘦身与服务层拆分**:`MerchantAppServer::index()` 已演变为“上帝方法”。建议引入 **Service 层** 或 **Repository 模式**,将权限校验、菜单构建、配置加载等逻辑剥离,控制器仅保留路由分发与响应组装。
2. **连接池与缓存优化**:`common_helper.php` 中的 Redis 封装方式属于典型反模式。建议统一接入 CI3 的 `Cache` 驱动或引入 `Predis`/`PhpRedis` 单例连接池,配合 `redis-cli monitor` 压测验证连接复用效果。
3. **配置与路由规范化**:
- 修正 `routes_method.php` 中的 `renark` 拼写错误。
- 将硬编码的商家 ID、时区、测试开关等迁移至 `application/config/custom.php` 或数据库配置表,实现环境隔离。
4. **代码规范升级**:逐步引入 `PHP_CodeSniffer` 配合 `PSR-12` 规则进行静态扫描。补充 PHPDoc 类型声明(如 `@param int $shop_id`、`@return array`),提升 IDE 提示与静态分析能力。
> 💡 **局限性说明**:`application/helpers/common_helper.php` 文件内容在末尾被截断,未能完整审查所有 Redis 辅助函数及后续逻辑。建议提供完整文件以便进行更精准的内存泄漏与并发安全评估。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779154430
|
1779154430
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
154
|
22
|
7
|
1
|
|
0
|
🔍 代码审查报告:app-260616 - Merge pull request '合并05 🔍 代码审查报告:app-260616 - Merge pull request '合并0519' (#5) from app into app...
|
## 自动代码审查报告
**分支**: app-260616
**提交**: `234bbc930 ## 自动代码审查报告
**分支**: app-260616
**提交**: `234bbc930020fa11e114dd4f1fd5fa7202f11281`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-19 09:35:01
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了较为完整的业务路由与支付回调逻辑,但存在**严重的安全隐患**(硬编码敏感密钥、CORS 通配、支付回调缺乏幂等性)、**架构设计缺陷**(基类职责严重过载、Helper 耦合数据库查询)以及**规范问题**(拼写错误、调试代码未清理、文件截断)。整体可维护性与安全性亟待提升。
- **风险等级**:🔴 高
> 📌 **框架说明**:提交代码实际基于 **CodeIgniter 3.x** 架构(特征:`defined('BASEPATH')`、`$this->load->model()`、`$this->db->` 等)。以下审查将基于 CI 最佳实践与通用 PHP 规范进行。若项目为 `phpci` 定制分支,请同步对照其官方文档调整。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `MerchantAppServer.php` (约 L430-L435) | 登录接口响应中**硬编码并明文返回**科大讯飞 TTS 密钥(`APPID`, `APISecret`, `APIKey`),极易导致云服务被盗刷及敏感数据泄露。 | 移除前端直传密钥逻辑。改为服务端代理调用,或下发临时签名/Token。若必须下发,需加密传输并配合 IP 白名单。 | `// ❌ 错误:直接暴露密钥<br>'xfyun_tts_config' => ["APPID"=>"5bea616f", "APISecret"=>"...", "APIKey"=>"..."]<br><br>// ✅ 建议:移除或改为服务端代理接口` |
| 🔴 严重 | `WxNotify.php` (L118) | 支付宝回调验签使用硬编码测试公钥 `"test"`,生产环境将导致验签失败或恶意伪造请求绕过。 | 从配置文件读取真实公钥,并严格校验签名与金额。 | `$aopClient->alipayPublicKey = $this->config->item('alipay_public_key');` |
| 🔴 严重 | `WxNotify.php` (全文件) | 支付回调接口**缺乏幂等性控制**。微信/支付宝在网络超时会重试回调,可能导致重复发货、重复充值或状态覆盖。 | 处理前校验订单状态,结合数据库唯一索引或 Redis 分布式锁保证幂等。 | `if ($order['status'] === 'PAID') { exit('SUCCESS'); }` |
| 🟠 警告 | `MerchantAppServer.php` (L38-L40) | 全局设置 `Access-Control-Allow-Origin: *`,存在 CSRF 攻击与数据越权读取风险。 | 限制为可信域名白名单,或根据 `Origin` 请求头动态匹配。 | `header("Access-Control-Allow-Origin: " . ($allowed_origin ?: 'https://yourdomain.com'));` |
| 🟠 警告 | `MerchantAppServer.php` (L60-L150) | 构造函数承担路由解析、鉴权、权限校验、配置加载、日志记录等过多职责,违反单一职责原则,难以单元测试与维护。 | 拆分为独立中间件/钩子(如 `AuthMiddleware`、`PermissionMiddleware`),控制器仅保留业务分发逻辑。 | `// 架构建议:使用 CI Hooks 或自定义 Middleware 处理鉴权与权限` |
| 🟠 警告 | `common_helper.php` (L1-L80) | `get_mac_by_url` 辅助函数中直接 `load->model()` 并执行多次 DB 查询。Helper 应保持轻量无状态,耦合 DB 会导致性能下降与循环依赖。 | 将 DB 查询移至 Model/Service 层,Helper 仅负责 URL 字符串解析并返回结构化参数。 | `// Helper 仅返回解析后的 room_id 或 qrcode_type<br>return ['type' => 'weixin', 'raw' => $family_server_id];` |
| 🟠 警告 | `common_helper.php` (L150+) | Redis 封装函数每次调用都新建连接并 `close()`,高并发下会导致连接池耗尽、TCP 握手延迟及性能瓶颈。 | 使用 CI 内置 Cache 驱动或单例模式复用连接,避免频繁创建/销毁。 | `$this->load->driver('cache', ['adapter' => 'redis', 'backup' => 'file']);` |
| 🟡 建议 | `routes_method.php` (多处 & 末尾) | 1. 多处键名 `'renark'` 拼写错误(应为 `'remark'`)<br>2. 文件末尾截断,缺失闭合括号 `],` 与 `];`,将直接导致 `Parse Error`。 | 全局替换拼写错误,补全数组结构。建议将路由配置迁移至数据库或独立 JSON/YAML 管理。 | `'a617' => ['class' => 'Vip', 'method' => 'changeVipCardPoints', 'remark' => '修改会员积分'],` |
| 🟡 建议 | `WxNotify.php` (L145-L175) | 遗留调试方法 `aliHallNativeNotifytest` 未清理,可能干扰路由分发或暴露测试逻辑。 | 彻底删除或移至独立的 `tests/` 目录,生产代码严禁保留调试入口。 | `// 删除整个 aliHallNativeNotifytest 方法` |
| 🟡 建议 | `common_helper.php` (L138) | `is_float($float)` 类型检查过于严格,传入字符串数字(如 `'1.5'` 或 `$_GET` 参数)会返回 `false` 导致逻辑中断。 | 改用 `is_numeric()` 兼容字符串数字格式。 | `if (!empty($keyName) && is_numeric($float))` |
## 3. 总结与行动建议
### 🚨 优先修复(P0)
1. **移除硬编码敏感信息**:立即下线 `MerchantAppServer.php` 中的讯飞 TTS 密钥,替换为服务端代理或动态签名机制。
2. **修复支付验签与幂等**:修正 `WxNotify.php` 支付宝公钥配置,并在所有支付回调入口增加订单状态校验与防重放锁(如 `Redis SETNX` 或 DB `UPDATE ... WHERE status = 'PENDING'`)。
3. **修复语法错误**:补全 `routes_method.php` 末尾截断的数组结构,全局修正 `'renark'` 拼写错误,避免部署时直接崩溃。
### 🛠 架构与规范优化(P1)
1. **基类瘦身**:`MerchantAppServer` 构造函数代码已超 200 行,建议将 Token 解析、权限校验、日志记录抽离为 CI `Hooks` 或独立 `Middleware` 类,控制器仅保留 `switch` 路由分发。
2. **Helper 职责净化**:`common_helper.php` 中的 Redis 与 DB 操作应迁移至 `libraries/` 或 `models/`。Helper 仅保留纯函数(如字符串处理、格式转换)。
3. **CORS 安全收敛**:将 `Access-Control-Allow-Origin: *` 替换为白名单机制,防止恶意站点跨域调用商家接口。
### 📈 后续重构方向
- **配置外置化**:路由映射、微信模板 ID、支付公钥等配置建议迁移至数据库或 `.env`/`config` 文件,避免硬编码与频繁发版。
- **统一响应与异常处理**:当前 `throwError`、`error_response`、`success_response` 散落在各处,建议封装为统一的 `ApiResponse` 类,结合 CI 的 `Exceptions` 机制实现全局异常拦截。
- **引入静态分析工具**:建议接入 `PHPStan` 或 `Psalm` 进行类型检查,配合 `PHP_CodeSniffer` 强制落地 PSR-12 规范,提升代码可维护性。
> 💡 **局限性说明**:`routes_method.php` 文件末尾存在明显截断,本次审查仅基于已提供片段。若实际文件包含更多逻辑或依赖未提供的 Model/Helper,建议补充完整上下文以便进行更精准的调用链分析。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779154501
|
1779154501
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
175
|
22
|
8
|
1
|
|
0
|
🔍 代码审查报告:app-260519 - 1
|
## 自动代码审查报告
**分支**: app-260519
**提交**: `2aabf960a ## 自动代码审查报告
**分支**: app-260519
**提交**: `2aabf960a677f132ad3491a05777a43b01aeec7b`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-19 13:15:08
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:代码实现了复杂的预订、退款、开房及订单流转业务,功能覆盖较全。但存在明显的事务管理混乱、N+1 查询性能瓶颈、SQL 拼接安全隐患及大量硬编码魔法数字。部分方法职责过重(如 `refund_by_notify` 超过 200 行),违反单一职责原则。
- **风险等级**:🔴 高(存在事务不一致、潜在 SQL 注入及外部支付调用与数据库事务耦合风险)
> 📌 **说明**:代码结构高度符合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制框架,请对照其官方文档调整事务控制与模型加载机制。末尾 `update_by_change_room` 方法代码被截断,本次审查仅基于已提供内容。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_book_order_model.php` ~L130 | **SQL 注入风险**:`$log_where` 使用字符串拼接构建查询条件,若 `_id` 未严格过滤,将导致注入漏洞。 | 废弃字符串拼接,统一使用框架查询构造器或参数绑定。 | `$this->db->where('_relation_id', $order_data['_id'])->where_in('_type', [5,13])->where('_status', 1)->update(...)` |
| 🔴 严重 | `Ahead_book_order_model.php` ~L60, ~L330 | **事务与外部 API 耦合**:`invalid_book` 开启事务后调用 `refund_by_notify`,后者内部执行微信/银联退款请求。若外部 API 超时或失败,数据库已回滚但资金可能已退还,造成数据与资金不一致。 | 将外部支付调用移出数据库事务。采用“先更新本地状态为退款中 → 调用外部 API → 根据回调更新最终状态”的异步/补偿事务模式。 | 见下方架构建议 |
| 🔴 严重 | `Ahead_book_order_model.php` ~L60, ~L330 | **事务控制混乱**:混用 `trans_start()` 与手动 `trans_rollback()`/`trans_complete()`。若 `throwError` 为 `exit/die` 而非抛出异常,将导致事务挂起或死锁。 | 统一使用 CI 标准事务流:`trans_start()` → 业务逻辑 → `trans_complete()` → 检查 `trans_status()`。确保 `throwError` 抛出 `\Exception`。 | `try { $this->db->trans_start(); ... $this->db->trans_complete(); if ($this->db->trans_status() === FALSE) throw new \Exception('事务失败'); } catch (\Exception $e) { $this->db->trans_rollback(); throw $e; }` |
| 🟠 警告 | `Ahead_book_order_model.php` ~L230 | **N+1 查询性能瓶颈**:`get_list` 循环内调用 `get_one` 查询关联订单,列表数据量大时会导致数十次额外 DB 请求。 | 提取所有 `relation_order_id`,使用 `WHERE IN` 批量查询或 `LEFT JOIN` 一次性获取。 | `$ids = array_filter(array_column($order_info, 'relation_order_id')); if($ids) { $orders = $this->ahead_yc_order_model->select(['where_in'=>['_id',$ids]], '_id,_machine_name'); $orderMap = array_column($orders, '_machine_name', '_id'); }` |
| 🟠 警告 | `Ahead_book_order_model.php` ~L1, `Ahead_yc_order_process_model.php` ~L1 | **全局实例获取违规**:在类外部直接 `$CI =& get_instance();` 违反框架生命周期,在 CLI 或单元测试中易引发未初始化错误。 | 移至构造函数中初始化,或按需通过 `$this->CI =& get_instance()` 获取。 | `public function __construct() { parent::__construct(); $this->CI =& get_instance(); }` |
| 🟠 警告 | `Ahead_book_order_model.php` ~L110 | **敏感数据日志泄露**:`doLog(var_export($res, true), ...)` 直接记录支付网关完整响应,可能包含商户密钥、用户 OpenID、交易流水等敏感信息。 | 脱敏后记录,仅保留状态码、订单号、错误信息。 | `doLog(json_encode(['order_id'=>$order_data['_id'], 'status'=>$res_data['response']['result_status']??'', 'msg'=>$res_data['response']['error_msg']??'']), 'BookOrderWxRefund');` |
| 🟡 建议 | `Ahead_book_order_model.php` 多处 | **魔法数字泛滥**:大量使用 `1, 2, 3, 4, 5, 13, 17...` 表示状态/支付渠道,可读性差且维护成本高。 | 提取为类常量或独立配置类,如 `const STATUS_PAID = 1; const PAY_WX = 1;`。 | `if ($book_order['_status'] === self::STATUS_PAID) { ... }` |
| 🟡 建议 | `Ahead_book_order_model.php` ~L105 | **弱类型比较隐患**:`$is_refund == '1'` 使用松散比较,PHP 隐式转换可能导致非预期分支执行。 | 统一使用严格比较 `===` 或在入口处进行类型强转。 | `$is_refund = (int)$is_refund; if ($is_refund === 1) { ... }` |
| 🟡 建议 | `Ahead_yc_order_process_model.php` ~L100 | **重复代码**:`send_to_screen` 与 `order_refund_send_to_screen` 构建 WebSocket 请求数组逻辑高度重复。 | 抽取私有方法 `build_screen_request(array $params)` 复用,提升可维护性。 | `private function build_screen_request($data) { return ['header'=>['data_type'=>'proxy',...], 'request'=>$data]; }` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **重构事务边界**:立即将 `refund_by_notify` 中的微信/银联退款调用移出数据库事务。采用 **本地状态预更新 → 异步/同步调用支付网关 → 依赖回调更新最终状态** 的模式,避免资金与数据不一致。
2. **修复 SQL 拼接漏洞**:全局替换 `$this->model->up($raw_string)` 类用法,全面改用框架 Query Builder 或预处理参数绑定。
3. **消除 N+1 查询**:对 `get_list`、`get_detail` 等列表/详情接口实施批量查询优化,预计可降低 60% 以上的数据库 I/O 耗时。
4. **规范异常处理**:确认 `throwError` 实现机制。若仅为 `die()`,请替换为 `throw new \RuntimeException()` 以确保 `try-catch` 与事务回滚能正确捕获。
### 🛠 后续重构与优化方向
- **单一职责拆分**:`refund_by_notify` 方法过长(>200行),建议拆分为:
- `prepareRefundData()`:数据组装与校验
- `executePaymentRefund()`:支付网关调用
- `updateRefundLogs()`:日志与流水更新
- `handleCommunityRefund()`:社区业务逻辑
- **引入常量/枚举管理**:建立 `OrderStatus`, `PayPlatform`, `ProcessStep` 等配置类,彻底消除魔法数字。
- **模型懒加载优化**:频繁在方法内 `$this->load->model()` 会增加开销。建议在 `__construct` 中集中加载高频模型,或启用框架的自动加载机制。
- **日志脱敏规范**:制定全局日志规范,支付、用户隐私字段必须经过 `mask_sensitive_data()` 过滤后再落盘。
- **补充单元测试**:针对 `invalid_book`、`openRoomByCommunityOrder` 等核心链路编写 Mock 测试,覆盖事务回滚、外部 API 超时、并发开房等边界场景。
> 💡 **框架适配提示**:若 `phpci` 对事务或模型加载有特殊封装(如自动事务代理、依赖注入容器),请优先遵循其官方文档。上述建议基于标准 CI3/PHP 最佳实践,可直接平滑迁移。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779167708
|
1779167708
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
181
|
22
|
9
|
1
|
|
0
|
🔍 代码审查报告:app-260519 - 1
|
## 自动代码审查报告
**分支**: app-260519
**提交**: `fc28a1961 ## 自动代码审查报告
**分支**: app-260519
**提交**: `fc28a1961ee774bff6f5ca865687e04f6002fe8f`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-19 13:34:18
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该 Model 承载了核心支付流水、退款、报表统计等关键业务逻辑,功能完整但架构耦合度较高。代码中存在明显的 SQL 注入风险、N+1 查询性能瓶颈、事务与外部 API 调用顺序导致的财务一致性隐患,且部分方法严重违反单一职责原则。整体可维护性与安全性亟待提升。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `update_refund_amount` / `refund` | **SQL 注入风险**:使用字符串拼接构造 `WHERE` 与 `UPDATE` 语句(如 `'_relation_id="' . $relation_id . '"...'`),未进行参数绑定或转义,若参数可控将导致严重数据泄露或篡改。 | 全面改用框架查询构造器(Query Builder)或数组条件传参,杜绝原生字符串拼接。 | `$this->db->where('_relation_id', $relation_id)->where('_type', $type)->where_in('_status', [1,4])->get()->row();`<br>`$this->db->set('_refund_amount', '_refund_amount+' . floatval($refund_amount), FALSE)->update($this->table_name, ['_id' => $pay_id]);` |
| 🔴 严重 | `refund` 方法末尾 | **事务与外部 API 顺序导致财务不一致**:`$this->db->trans_commit()` 执行后才调用 `mobile_refund()`。若支付网关退款失败,数据库已标记退款成功,造成资金账实不符。 | 引入异步消息队列处理网关退款;或改为同步调用并包裹 `try-catch`,失败时触发补偿逻辑/人工工单。 | `// 建议改为异步任务<br>$this->load->library('queue');<br>$this->queue->push('refund_gateway', ['pay_id' => $pay_id, 'amount' => $refund_amount]);` |
| 🟠 警告 | `get_bill_pay_log` / `get_refundable_pay_log` | **N+1 查询性能瓶颈**:在 `foreach` 循环内多次调用 `get_one()` 及 `get_custom_pay_platform()`,数据量超 50 条时将引发数百次 DB 请求,严重拖慢响应。 | 循环前批量查询,使用 `where_in` 获取数据并构建映射数组,循环内直接读取。 | `$ids = array_column($log_data, 'relation_id');<br>$extensions = $this->ahead_yc_order_extension_model->get_list(['where_in' => ['_order_id', $ids]]);<br>$extMap = array_column($extensions, null, '_order_id');<br>// 循环内直接 $extMap[$v['relation_id']] ?? null` |
| 🟠 警告 | `mobile_refund` | **硬编码敏感配置**:MD5 签名盐值 `'1441600902'`、`'2017040606573534'` 直接写死在代码中,违反安全规范且不利于多环境部署。 | 移至配置文件(如 `config/payment.php`),通过 `$this->config->item()` 读取。 | `$salt = $this->config->item('wx_refund_salt');<br>$data['refund_key'] = md5($order_info['_id'] . $order_info['_trade_no'] . $salt);` |
| 🟠 警告 | 文件顶部 | **全局实例化框架对象**:`$CI = &get_instance();` 在类外部全局调用。若文件在框架未完全初始化时被 `include`,将触发致命错误。 | 移除全局调用。依赖 CI 的自动加载机制,或在 `__construct()` 中按需加载。 | `// 删除顶部两行<br>public function __construct() {<br> parent::__construct();<br> $this->load->model('Simple_model');<br>}` |
| 🟠 警告 | `update_after_pay_call_back` | **回调逻辑缺乏事务保护**:连续更新多个关联模型(营收、用户消费、地图数据、销售日志),任一失败将导致数据不一致。 | 包裹在 `$this->db->trans_begin()` 中,或改为发布事件/消息队列异步解耦。 | `$this->db->trans_begin();<br>try { /* 更新逻辑 */ $this->db->trans_commit(); } catch(\Exception $e) { $this->db->trans_rollback(); throw $e; }` |
| 🟡 建议 | 全局方法命名 | **违反 PSR-12 命名规范**:方法名使用蛇形命名(`snake_case`),不符合现代 PHP 标准,降低 IDE 提示与团队协作效率。 | 统一改为驼峰命名(`camelCase`),如 `addOrderPayLog`、`updateAfterPayCallback`。 | `public function addOrderPayLog($merchantId, $adminUid, $type, $relationId, $params, $multPayIndexArr = [])` |
| 🟡 建议 | `refund` 方法 | **严重违反单一职责原则 (SRP)**:方法长达 300+ 行,混合了事务控制、VIP 余额计算、日志落库、网关调用、打印通知、跨日处理等逻辑。 | 拆分为独立私有方法或提取为 `RefundService` 服务类,主方法仅负责流程编排。 | `private function processVipRefund($payData, $amount) { ... }`<br>`private function callPaymentGateway($payData, $amount) { ... }` |
| 🟡 建议 | `add_by_vip_recharge_order` | **代码截断导致审查受限**:文件末尾 `$this-` 处被截断,无法评估完整逻辑。 | 请补充完整代码以便进行闭环审查。 | *(待补充)* |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **立即修复 SQL 注入漏洞**:`update_refund_amount` 与 `refund` 中的字符串拼接是最高危项。请全面替换为框架提供的参数化查询或数组条件构造方式。
2. **解决退款事务与网关调用不一致**:财务类操作必须保证最终一致性。建议将 `mobile_refund` 移至异步队列执行,或在同步调用失败时记录补偿任务并告警。
3. **消除 N+1 查询**:报表与流水列表接口是高频调用点,务必将循环内的单条查询改为批量 `WHERE IN` 查询,预计可提升 60%~80% 的接口响应速度。
### 🛠 后续重构与优化方向
- **架构解耦**:当前 Model 承担了过多业务逻辑。建议引入 **Service 层** 处理退款、报表聚合等复杂流程,Model 仅负责数据持久化。符合 `phpci`/CI 框架的 `MVC` 最佳实践。
- **配置集中化**:将支付平台映射、MD5 盐值、业务类型常量等硬编码内容统一收敛至 `config/` 目录,支持多商户/多环境动态加载。
- **规范与可维护性**:
- 逐步将方法名重构为 `camelCase`,属性名统一为 `protected/private` 并添加类型声明(PHP 7.4+ 支持)。
- 清理历史注释(如 `// 之前不知道为啥被注释掉...`),补充关键业务分支的 PHPDoc 说明。
- 对 `throwError()` 等全局异常函数进行统一封装,建议替换为 `throw new \RuntimeException()` 配合全局异常处理器,便于日志追踪与 API 标准化返回。
> 💡 **框架适配说明**:本代码高度符合 CodeIgniter 3 的语法特征。若 `phpci` 为基于 CI 深度定制的框架,上述 Query Builder 用法、事务控制及配置加载方式通常完全兼容。如遇特定生命周期钩子差异,建议查阅 `phpci` 官方文档中关于 `Database` 与 `Transaction` 的章节进行微调。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779168858
|
1779168858
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
191
|
22
|
10
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1779171090
|
1779171196
|
1779171094
|
0
|
0
|
0
|
Edit
Delete
|
|
192
|
22
|
11
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1779171106
|
1779171217
|
1779171109
|
0
|
0
|
0
|
Edit
Delete
|
|
193
|
22
|
12
|
1
|
|
0
|
🔍 代码审查报告:app-260519 - Merge remote-tracking branch 🔍 代码审查报告:app-260519 - Merge remote-tracking branch 'app/app-260519' into...
|
## 自动代码审查报告
**分支**: app-260519
**提交**: `3e251a363 ## 自动代码审查报告
**分支**: app-260519
**提交**: `3e251a363b22be804cc9de7ae816688b5476f852`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-19 14:13:05
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:业务逻辑覆盖较全,支付、退款、预订等核心流程具备基础实现。但存在多处 **SQL 注入风险**、**事务管理不规范** 及 **逻辑缺陷**,且代码风格偏向老旧写法,未充分利用现代 PHP 特性与框架查询构造器。整体可维护性与安全性有待大幅提升。
- **风险等级**:🔴 高
> ⚠️ **局限性说明**:`Ahead_pay_log_model.php` 文件末尾代码被截断(`$this-`),无法评估完整逻辑。以下审查基于已提供片段,建议补全后二次复核。
> 📌 **框架说明**:代码结构特征(`$CI = &get_instance()`、`Simple_model`、`$this->load->model()`、`$this->db->trans_*`)高度符合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制或衍生框架,请结合其官方文档调整生命周期与组件调用方式。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_pay_log_model.php`<br>`update_refund_amount` / `refund` | **SQL 注入漏洞**:WHERE 条件与 UPDATE 语句直接使用字符串拼接(如 `'_relation_id="' . $relation_id . '"`),未使用参数绑定或查询构造器,恶意输入可导致数据篡改或泄露。 | 全面改用 CI3 查询构造器(Query Builder)或 `$this->db->query()` 配合占位符。 | `$this->db->where('_relation_id', $relation_id)<br>->where('_type', $type)<br>->where_in('_status', [1, 4]);` |
| 🔴 严重 | `Ahead_preorder_order_model.php`<br>`open_room` 方法内循环 | **逻辑缺陷/数据错乱**:`$in_process[] = $data;` 错误地将外部查询结果 `$data` 插入流程数组,应为当前循环变量 `$in_process_v`。将导致流程记录错乱或插入空数据。 | 修正变量引用,确保插入正确的流程状态对象。 | `// 错误:$in_process[] = $data;<br>// 正确:<br>$in_process[] = $in_process_v;` |
| 🔴 严重 | `Ahead_book_order_model.php`<br>`refund_by_notify` | **SQL 注入漏洞**:`$log_where = '_relation_id="' . $order_data['_id'] . '" and _status=1...'` 直接拼接。同属高危注入点。 | 使用模型封装的查询构造器方法,避免手写 SQL 字符串。 | `$this->ahead_pay_log_model->db->where('_relation_id', $order_data['_id'])<br>->where('_status', 1)<br>->where_in('_type', [5, 13]);` |
| 🟠 警告 | 多个 Model 文件 | **事务管理不规范**:手动调用 `trans_begin()` / `trans_rollback()` / `trans_commit()`,但业务中大量使用 `throwError()`。若该函数抛出异常或 `exit`,将跳过 `rollback`,导致脏数据或资金不一致。 | 使用 `try...catch` 包裹事务块,或改用 CI3 自动事务模式 `trans_start()` / `trans_complete()`。 | `try {<br> $this->db->trans_start();<br> // 业务逻辑<br> $this->db->trans_complete();<br>} catch (\Exception $e) {<br> $this->db->trans_rollback();<br> throw $e;<br>}` |
| 🟠 警告 | 多个 Model 文件 | **性能瓶颈 (N+1查询)**:在业务方法中频繁调用 `$this->load->model()`,部分甚至在循环或高频回调中加载。每次加载都会触发文件包含与实例化,拖慢响应。 | 将依赖模型统一移至 `__construct()` 初始化,或使用服务容器/依赖注入。 | `public function __construct() {<br> parent::__construct();<br> $this->load->model(['model_a', 'model_b', 'model_c']);<br>}` |
| 🟠 警告 | `Ahead_pay_log_model.php`<br>`add_order_pay_log` | **类型比较隐患**:`in_array($type, array_keys(self::PAY_LOG_TITLE_MAP))` 未开启严格模式。常量键为字符串 `'1'`,若传入整型 `1` 会因松散比较返回 `true`,可能引发类型混淆。 | 开启严格比较或统一类型转换。 | `in_array((string)$type, array_keys(self::PAY_LOG_TITLE_MAP), true)` |
| 🟡 建议 | 全局代码 | **代码规范与可维护性**:大量使用 `array()` 而非 `[]`;存在硬编码(如 `md5` 盐值、模板索引 `10`);注释包含个人调试记录(如 `2020-09-30,hlj`);未使用类型声明。 | 遵循 PSR-12;提取配置/常量;清理调试注释;启用 `declare(strict_types=1)` 与参数类型提示。 | `const WX_REFUND_SALT = '1441600902';<br>public function refund(int $pay_id, float $amount): bool` |
| 🟡 建议 | `Ahead_yc_order_process_model.php`<br>`add_order_process` | **空值判断不严谨**:`is_null($userInfo)` 用于判断数组返回值。若查询失败返回 `false` 或空数组,`is_null` 将失效。 | 使用 `empty()` 或 `isset()` 进行安全判断。 | `$userName = !empty($userInfo['_name']) ? $userInfo['_name'] : '';` |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **立即修复 SQL 注入点**:全局搜索 `'_xxx="' . $var . '"` 或 `'_xxx=' . $var` 模式,全部替换为 CI3 Query Builder 的 `where()`、`where_in()`、`set()` 方法。支付与退款模块涉及资金安全,必须作为 P0 级任务处理。
2. **修正 `open_room` 变量赋值 Bug**:`$in_process[] = $data;` 会导致流程日志写入错误数据,直接影响订单状态追踪与售后排查。
3. **统一事务异常处理机制**:将 `trans_begin/rollback/commit` 包裹在 `try...catch` 中,或全面迁移至 `trans_start()/trans_complete()` 自动模式,确保任何异常(包括 `throwError`)都能安全回滚。
### 🛠 后续重构与优化方向
| 优化维度 | 具体建议 |
| :--- | :--- |
| **架构解耦** | 当前 Model 承担了过多业务逻辑(支付、退款、库存、消息推送、报表统计)。建议抽取 `PaymentService`、`RefundService`、`OrderProcessService` 等独立服务类,Model 仅负责数据持久化。 |
| **性能提升** | 1. 模型依赖集中初始化,避免运行时重复加载。<br>2. 报表类查询(如 `get_business`)增加数据库索引覆盖(`_create_time`, `_pay_platform`, `_status`)。<br>3. 高频读取的配置(如支付平台映射)建议接入 Redis 缓存。 |
| **规范升级** | 1. 全面启用 `declare(strict_types=1)` 与 PHP 7.4+ 类型声明。<br>2. 替换 `array()` 为 `[]`,统一使用 PSR-12 缩进与命名规范。<br>3. 移除硬编码,将支付盐值、模板 ID、业务状态映射移至配置文件或数据库字典表。 |
| **框架适配** | 若项目确为 `phpci` 定制版,请确认其是否重写了 `Simple_model` 的生命周期或查询构造器。建议查阅官方文档确认 `load->model()` 的缓存机制与事务钩子,避免与原生 CI3 行为冲突。 |
> 💡 **审查专家提示**:支付与退款链路是系统的“资金命脉”。建议在修复上述问题后,补充 **单元测试**(覆盖正常支付、部分退款、并发退款、异常回滚等场景)与 **集成测试**,并引入静态代码分析工具(如 `PHPStan` 或 `Psalm`)进行常态化质量门禁。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779171185
|
1779171185
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
194
|
22
|
13
|
1
|
|
0
|
🔍 代码审查报告:app - Merge pull request '1' (#10 🔍 代码审查报告:app - Merge pull request '1' (#10) from app-260519 into...
|
## 自动代码审查报告
**分支**: app
**提交**: `582c55ea02676486 ## 自动代码审查报告
**分支**: app
**提交**: `582c55ea0267648620394ada0a2763c7094e68e1`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-19 14:13:16
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:业务逻辑覆盖较全,但代码结构呈现典型的“上帝方法”特征,职责边界模糊。存在明显的 SQL 注入风险、N+1 查询性能瓶颈、事务管理不规范及硬编码泛滥等问题。整体可维护性与安全性亟待提升。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_preorder_order_model.php`<br>`open_room()` 方法内 | **逻辑错误/数据污染**:在 `foreach ($in_arr as $order)` 循环中,错误地将未定义的 `$data` 推入 `$in_process` 数组,导致流程日志插入脏数据或引发 PHP Warning。 | 修正为当前循环变量 `$in_process_v`。 | `$in_process[] = $in_process_v;` |
| 🔴 严重 | `Ahead_book_order_model.php`<br>`refund_by_notify()` 等多处 | **SQL 注入风险**:多处使用字符串拼接构造 `WHERE` 或 `UPDATE` 条件,如 `'_relation_id="' . $order_data['_id'] . '" and _status=1...'`,未做参数绑定或转义。 | 全面替换为框架查询构造器(Query Builder)或参数化查询。 | `$this->db->where('_relation_id', $order_data['_id'])->where('_status', 1)->update(...)` |
| 🟠 警告 | `Ahead_book_order_model.php`<br>`get_list()` 方法 | **N+1 查询性能瓶颈**:在 `foreach ($order_info as &$v)` 循环中逐条调用 `$this->ahead_yc_order_model->get_one()`,订单量稍大时将导致数据库连接耗尽与响应超时。 | 提取所有 `relation_order_id`,使用 `WHERE IN` 批量查询后映射到数组。 | `$ids = array_column($order_info, 'relation_order_id'); $orders = $this->ahead_yc_order_model->select(['where_in' => ['_id', $ids]]);` |
| 🟠 警告 | `Ahead_book_order_model.php`<br>`Ahead_pay_log_model.php` 等 | **事务管理隐患**:混合使用 `$this->db->trans_start()` 与手动 `trans_rollback()`,且 `throwError()` 若直接 `exit/die` 会导致事务未提交/回滚,引发数据库锁表或连接泄漏。 | 统一采用 `trans_begin()` + `try/catch` + `trans_status()` 标准模式。 | 见下方重构示例 |
| 🟠 警告 | 全局 Model 文件顶部 | **框架生命周期违规**:在类外部直接执行 `$CI =& get_instance(); $CI->load->model('Simple_model');`,违反 CI3 加载规范,且每次请求都会无条件执行。 | 移除文件顶部代码,将模型加载移至 `__construct()` 或具体业务方法内。 | `public function __construct() { parent::__construct(); $this->load->model('Simple_model'); }` |
| 🟡 建议 | 全局业务逻辑 | **魔法数字泛滥**:支付类型(`1,2,14`)、订单状态(`1,4`)、时间阈值(`30`)等硬编码散落各处,后期维护极易出错。 | 提取为类常量或独立配置文件,增强语义化。 | `const STATUS_PAID = 1; const PAY_PLATFORM_WX = 1; const BOOK_TIME_LIMIT_MIN = 30;` |
| 🟡 建议 | `Ahead_book_order_model.php`<br>`openRoomByCommunityOrder()` | **方法职责过重(God Method)**:单方法超 300 行,混合了订单创建、库存扣减、支付回调、硬件通知、日志记录等逻辑,违背单一职责原则。 | 拆分为 `OrderService`、`PaymentService`、`DeviceNotifyService` 等独立组件。 | 采用事件驱动或 Service 层模式解耦 |
| 🟡 建议 | 全局命名规范 | **命名不一致**:`setTablename` 与 `set_table_name` 混用;类名大小写不规范;注释代码未清理。 | 严格遵循 PSR-12 及项目统一命名约定,清理废弃代码。 | 统一使用 `set_table_name()`;删除 `//` 注释块 |
**🔧 事务安全重构示例(推荐替换现有 `trans_start` 写法):**
```php
$this->db->trans_begin();
try {
// 1. 执行数据库操作
$this->db->insert('orders', $data);
$this->db->update('logs', $logData);
// 2. 检查事务状态
if ($this->db->trans_status() === FALSE) {
throw new Exception('数据库操作失败');
}
$this->db->trans_commit();
return true;
} catch (Exception $e) {
$this->db->trans_rollback();
// 记录日志或抛出业务异常,避免直接 exit 导致连接泄漏
log_message('error', 'Transaction failed: ' . $e->getMessage());
throw $e;
}
```
## 3. 总结与行动建议
### 🚨 优先修复的关键问题
1. **修复 SQL 注入漏洞**:立即排查所有使用字符串拼接构造 SQL 条件的地方,替换为 CI3 的 `$this->db->where()`、`$this->db->set()` 或原生预处理语句。
2. **修正循环赋值 Bug**:修复 `Ahead_preorder_order_model::open_room()` 中的 `$in_process[] = $data;` 错误,避免生产环境流程日志错乱。
3. **规范事务控制**:将 `trans_start()` 与 `throwError()` 的混用改为标准的 `try-catch` + `trans_begin()` 模式,防止异常中断导致数据库死锁。
4. **消除 N+1 查询**:重构 `get_list()` 及报表类方法,将循环内单条查询改为批量 `WHERE IN` 查询或 `JOIN`。
### 🛠 后续重构与优化方向
1. **架构分层**:当前 Model 承载了过多业务逻辑(支付、退款、硬件通信、报表计算)。建议引入 **Service 层** 处理复杂业务流程,Model 仅负责数据存取(CRUD),Controller 负责请求路由与参数校验。
2. **常量与配置集中化**:建立 `config/payment.php`、`config/order_status.php` 等配置文件,将硬编码的状态码、支付渠道、业务阈值统一管理。
3. **框架适配说明**:*注:您提供的代码结构(`$CI =& get_instance()`、`$this->load->model()`、`$this->db->trans_start()`)属于典型的 **CodeIgniter 3** 规范,而非 `phpci`(phpci 通常为持续集成工具)。若项目确为 CI3,请严格遵循其生命周期;若为自研框架,请确保基类 `Simple_model` 已正确封装事务与查询构造器。建议查阅对应框架官方文档确认组件加载机制。*
4. **自动化测试覆盖**:针对退款、开房等核心资金流转逻辑,补充单元测试与集成测试,确保金额计算、状态流转、第三方回调的幂等性与一致性。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779171196
|
1779171196
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
195
|
22
|
14
|
1
|
|
0
|
🔍 代码审查报告:app-260616 - Merge pull request '1 🔍 代码审查报告:app-260616 - Merge pull request '1' (#11) from app into app-260...
|
## 自动代码审查报告
**分支**: app-260616
**提交**: `ca8685bf1 ## 自动代码审查报告
**分支**: app-260616
**提交**: `ca8685bf1e6e2f4b02ea62d3657c59200d3693bf`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-19 14:13:37
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码具备完整的业务闭环能力,但存在严重的架构与规范问题。核心逻辑高度耦合在 Model 层,大量使用字符串拼接构造 SQL,事务与外部支付 API 混用导致资金一致性风险极高,且存在典型的 N+1 查询性能瓶颈。整体可维护性与安全性亟待重构。
- **风险等级**:🔴 高(涉及资金安全、SQL 注入、数据一致性)
> 📌 **框架说明**:代码语法特征(如 `$CI =& get_instance()`、`$this->load->model()`、`$this->db->trans_start()`)高度符合 **CodeIgniter 3** 规范。若 `phpci` 为贵司内部定制框架,请确认其底层 DB 驱动与事务机制是否与 CI 兼容。以下审查基于标准 PHP 及 CI 最佳实践。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_pay_log_model.php`<br>`Ahead_book_order_model.php` | **SQL 注入风险**:多处使用字符串拼接构造 `WHERE` 与 `UPDATE` 语句(如 `$log_where = '_relation_id="' . $order_data['_id'] . '"...'`),若上游数据未严格过滤,将导致严重注入漏洞。 | 全面改用 CI 查询构造器(Query Builder)或参数绑定,禁止手动拼接 SQL 片段。 | `$this->db->where('_relation_id', $order_data['_id'])`<br>`->where_in('_type', [5, 13])`<br>`->update('table', ['_status' => 4]);` |
| 🔴 严重 | `Ahead_book_order_model.php`<br>`invalid_book()` / `refund_by_notify()` | **事务与外部 API 混用**:在数据库事务内直接调用微信/银联退款 API。若 API 成功但后续 DB 操作失败触发回滚,将导致“钱已退、库未改”的资金不一致事故。 | 采用**最终一致性**设计:1. 先更新本地状态为 `退款中` 并提交事务;2. 异步/同步调用 API;3. 根据回调结果更新最终状态。失败则走补偿/重试队列。 | 见下方重构建议 |
| 🔴 严重 | `Ahead_book_order_model.php`<br>`get_list()` / `get_detail()` | **N+1 查询性能瓶颈**:在 `foreach` 循环中调用 `$this->ahead_yc_order_model->get_one()` 获取关联数据,数据量稍大时将引发严重性能雪崩。 | 收集所有关联 ID,使用 `where_in` 一次性批量查询,在内存中通过键值映射组装数据。 | `$ids = array_column($order_info, 'relation_order_id');`<br>`$orders = $this->ahead_yc_order_model->where_in('_id', $ids)->get()->result_array();`<br>`$map = array_column($orders, null, '_id');` |
| 🟠 警告 | `Ahead_preorder_order_model.php`<br>`get_list()` | **空数据抛出异常**:`throwError("没有更多数据了")` 将正常的业务空状态当作致命异常抛出,破坏调用方控制流,且不符合 RESTful 规范。 | 返回空数组 `[]`,由 Controller 层负责分页提示或前端展示逻辑。 | `return $data ?: [];` |
| 🟠 警告 | `Ahead_book_order_model.php`<br>`openRoomByCommunityOrder()` | **上帝方法(God Method)**:单方法超 300 行,承担订单创建、库存扣减、支付流水、外部通知、打印机调用等职责,违反单一职责原则(SRP),极难测试与维护。 | 引入 **Service 层** 拆分职责:`OrderCreationService`、`InventoryService`、`PaymentService`、`NotificationService`。Model 仅负责数据存取。 | 架构级重构,建议按业务域拆分 |
| 🟠 警告 | 全局多处 | **事务管理不规范**:混用 `trans_start()`、`trans_rollback()`、`trans_complete()` 与 `try-catch`。CI 的 `trans_complete()` 会自动检测状态并回滚,手动干预易导致事务状态机混乱。 | 统一使用 CI 标准事务流或 PHP 原生 `try-catch` 配合 `trans_begin()`。确保异常捕获后正确回滚。 | `try { $this->db->trans_begin(); ... $this->db->trans_commit(); } catch (\Exception $e) { $this->db->trans_rollback(); throw $e; }` |
| 🟡 建议 | 全局 | **代码规范与可读性**:命名不一致(`setTablename` vs `set_table_name`)、混用 `array()` 与 `[]`、缺乏 PHP 7+ 类型声明、遗留调试注释(如 `// 20210712版本,hlj`)。 | 严格遵循 PSR-12,统一短数组语法,添加参数/返回值类型声明,清理历史注释,使用 IDE 格式化。 | `public function get_list(int $merchant_id, array $param): array` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题(P0/P1)
1. **立即修复 SQL 拼接漏洞**:全局搜索 `up(`、`where = '`、`$log_where` 等字符串拼接 SQL 的位置,替换为 CI Query Builder 或 PDO 预处理。这是资金系统的红线。
2. **解耦事务与支付 API**:将 `refund_by_notify` 和 `mobile_refund` 中的第三方退款调用移出当前事务。改为“本地状态机 + 消息队列/定时任务补偿”模式,确保资金流水绝对可追溯。
3. **消除 N+1 查询**:对 `get_list`、`get_detail`、`get_bill_pay_log` 等列表/详情接口实施批量查询优化,预计可降低 60%~80% 的数据库 IO 耗时。
### 🛠 后续重构与优化方向
1. **架构分层(Model → Service → Controller)**:
- `Model` 层仅保留 CRUD、基础查询与数据校验。
- 将 `openRoomByCommunityOrder`、`invalid_book` 等复杂业务逻辑抽离至 `Service` 类,便于单元测试与复用。
- 使用依赖注入(DI)替代 `$this->load->model()` 动态加载,提升可测试性。
2. **统一异常处理机制**:
- 废弃全局 `throwError()` 函数,改用 PHP 标准 `throw new \RuntimeException()` 或自定义业务异常类(如 `BusinessException`)。
- 在框架入口或中间件统一捕获异常,返回标准化 JSON 响应。
3. **财务与状态机规范化**:
- 订单状态流转建议引入 **状态机模式(State Machine)**,明确定义合法流转路径,防止非法状态跃迁。
- 所有涉及金额的计算强制使用 `bcmath` 扩展(如 `bcadd`, `bcsub`),避免浮点数精度丢失。
4. **补充自动化测试**:
- 针对退款、开房、支付回调等核心链路编写 PHPUnit 单元测试与集成测试,覆盖正常流、异常流、网络超时、并发重复提交等场景。
> 💡 **局限性说明**:本次审查基于提供的 Model 层代码片段。由于未提供 `Simple_model` 基类实现、全局 Helper 函数(如 `throwError`, `get_business_date`)及 Controller 调用上下文,部分边界条件(如并发锁、幂等性设计)需结合完整项目链路进一步评估。建议优先落地 P0 安全与事务修复,再逐步推进架构重构。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779171217
|
1779171217
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
233
|
22
|
15
|
1
|
|
0
|
🔍 代码审查报告:app-260519 - 1
|
## 自动代码审查报告
**分支**: app-260519
**提交**: `5dff766fa ## 自动代码审查报告
**分支**: app-260519
**提交**: `5dff766fa30044778ad01abab4b076a9e8f5739c`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-20 11:28:05
---
## 1. 审查摘要
- **代码质量评分**:5.5/10
- **总体评价**:业务逻辑覆盖较完整,但存在严重的安全隐患(SQL 字符串拼接)、架构反模式(数据库事务内同步调用外部支付 API)、性能瓶颈(N+1 查询)及代码规范问题。整体可维护性较低,需优先重构事务边界、统一异常处理与数据查询策略。
- **风险等级**:🔴 高
## 2. 问题详情
*(注:行号为基于提供代码片段的估算值,实际以文件为准)*
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_book_order_model.php`<br>`refund_by_notify()` | **SQL 注入风险**:使用字符串直接拼接 `WHERE` 条件(如 `$log_where`、`$uwhere`、`$sup`),未使用查询构造器或参数绑定。若上游数据未严格过滤,将导致注入。 | 全面改用 CI 查询构造器或数组条件,禁止手动拼接 SQL 片段。 | `$this->db->where('_relation_id', $order_data['_id'])`<br>`->where('_status', 1)`<br>`->where_in('_type', [5, 13]);` |
| 🔴 严重 | `Ahead_book_order_model.php`<br>`invalid_book()` & `refund_by_notify()` | **事务内调用外部 API**:在 `trans_start()` 开启的事务中同步调用微信/银联退款接口。长事务会长时间持有数据库锁,极易引发死锁、连接池耗尽或请求超时。 | 采用“本地状态预更新 → 调用外部 API → 根据结果回调更新”的异步/补偿事务模式。将 API 调用移出事务块。 | 见下方重构建议 |
| 🟠 警告 | `Ahead_book_order_model.php`<br>`get_list()` | **N+1 查询性能瓶颈**:在 `foreach` 循环中调用 `get_one()` 查询关联订单,数据量大时将产生大量冗余查询。 | 提前批量查询关联数据,在内存中通过 `key-value` 映射组装。 | `$ids = array_column($order_info, 'relation_order_id');`<br>`$orders = $this->ahead_yc_order_model->get_many(['where_in' => ['_id', $ids]]);`<br>`$orderMap = array_column($orders, null, '_id');` |
| 🟠 警告 | `Ahead_preorder_order_model.php`<br>`open_room()` | **批量操作未包裹事务**:连续执行多个 `insert_batch()` 和 `update()`,若中途失败会导致数据不一致(如订单已插入但流水未记录)。 | 使用 `$this->db->trans_start()` 包裹所有批量写入操作,依赖框架自动回滚。 | `$this->db->trans_start();`<br>`// ... batch inserts ...`<br>`$this->db->trans_complete();` |
| 🟠 警告 | 所有 Model 文件顶部 | **模型加载时机不当**:文件顶部直接执行 `$CI = &get_instance(); $CI->load->model('Simple_model');`,导致每次请求解析文件时均触发加载,浪费资源。 | 将模型加载移至 `__construct()` 中,或依赖框架自动加载配置。 | `public function __construct() { parent::__construct(); $this->load->model('Simple_model'); }` |
| 🟡 建议 | 多处方法 | **魔法数字泛滥**:状态值(`1,4,5,13`)、支付类型(`1,3,14`)等硬编码散落各处,可读性差且后期维护极易遗漏。 | 在类顶部或独立配置文件中定义常量,统一引用。 | `const STATUS_PAID = 1; const STATUS_REFUNDED = 4;`<br>`const PAY_WX = 1; const PAY_VIP = 3;` |
| 🟡 建议 | `Ahead_book_order_model.php`<br>`openRoomByCommunityOrder()` | **手动回滚与框架机制冲突**:在 `try-catch` 中手动调用 `$this->db->trans_rollback()` 后抛出异常,可能与 CI 的自动事务管理机制产生冲突或重复回滚。 | 移除手动 `trans_rollback()`,仅依赖 `$this->db->trans_complete()` 的自动回滚特性。捕获异常后直接抛出或返回错误数组。 | 移除 `try` 块内的 `$this->db->trans_rollback();`,交由框架处理。 |
| 🟡 建议 | `Ahead_book_order_model.php` 末尾 | **代码截断**:文件在 `_add_order_data()` 方法处中断,无法审查完整逻辑及后续方法。 | 请补充完整文件以便进行全量评估。 | - |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **消除 SQL 拼接隐患**:立即将 `$log_where`、`$uwhere`、`$sup` 等字符串拼接改为查询构造器链式调用或数组条件。这是最高优先级的安全修复。
2. **重构事务边界**:将 `refund_by_notify()` 中的微信/银联退款 API 调用移出数据库事务。建议改为:
```php
// 1. 开启事务更新本地状态为“退款处理中”
$this->db->trans_start();
$this->update(['_status' => 3], ['_id' => $book_order['_id']]);
$this->db->trans_complete();
// 2. 调用外部退款 API
$api_res = $this->callRefundApi($order_data);
// 3. 根据 API 结果更新最终状态(可走异步回调或同步更新)
if ($api_res['success']) {
$this->update(['_status' => 4], ['_id' => $book_order['_id']]);
}
```
3. **解决 N+1 查询**:在 `get_list()` 和 `get_detail()` 中,使用 `WHERE IN` 批量拉取关联表数据,在 PHP 层进行数组映射,可将数据库查询次数从 `O(N)` 降至 `O(1)`。
### 🛠 后续重构与优化方向
- **统一异常与错误处理**:当前混用 `throwError()`、`return ['status'=>false]` 和 `try-catch`。建议统一使用标准 PHP 异常(如 `throw new \RuntimeException()`)或框架提供的异常类,配合全局异常处理器记录日志并返回标准化响应。
- **常量与配置抽离**:将支付平台、订单状态、业务模式等硬编码数字提取至 `config/constants.php` 或类常量中,提升代码自解释能力。
- **方法职责拆分**:`refund_by_notify()` 和 `openRoomByCommunityOrder()` 方法过长(超 150 行),违反单一职责原则。建议按“数据准备 → 外部交互 → 状态更新 → 日志记录”拆分为多个私有方法。
- **框架适配说明**:代码结构高度符合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制框架,请重点核对:
- `$this->db->trans_start()/trans_complete()` 的自动回滚行为是否与 CI3 一致。
- `$this->load->model()` 的缓存机制是否支持构造函数内加载。
- 若存在差异,请查阅 `phpci` 官方文档调整事务与模型加载策略。
> 💡 **提示**:本次审查基于提供的代码片段。若 `Ahead_book_order_model.php` 后续逻辑涉及敏感金额计算或并发控制,建议补充完整代码以便进行死锁风险与精度丢失的专项评估。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779247685
|
1779247685
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
234
|
22
|
16
|
1
|
|
0
|
🔍 代码审查报告:app-260519 - 1
|
## 自动代码审查报告
**分支**: app-260519
**提交**: `d26a61b26 ## 自动代码审查报告
**分支**: app-260519
**提交**: `d26a61b26e4e77436e307d60284609d79bf3f254`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-20 11:29:55
---
## 1. 审查摘要
- **代码质量评分**:4 / 10 分
- **总体评价**:该文件为典型的历史遗留型“上帝 Helper”,聚合了大量业务逻辑、底层工具与第三方服务调用。代码存在多处 **PHP 8.0+ 致命语法废弃**、**硬编码敏感凭证**、**数组操作逻辑缺陷**及**高频 Redis 连接创建**等严重问题。整体可维护性较低,需按模块拆分并遵循现代 PHP 规范进行重构。
- **风险等级**:🔴 高
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `alioss_deleteObject` / `alioss_addObject` | **硬编码云厂商 AccessKey/SecretKey**。直接暴露在源码中,极易导致 OSS 存储桶被恶意读写或产生高额账单。 | 移至 `config/oss.php` 或环境变量,通过 `$CI->config->item()` 读取。生产环境严禁硬编码。 | `'accessId' => $CI->config->item('oss_access_id')` |
| 🔴 严重 | `getFirstCharter` | **PHP 8 致命错误**:使用 `$str{0}` 访问字符串。PHP 7.4 已废弃,PHP 8.0+ 直接抛出 `Fatal Error`。 | 统一替换为方括号语法 `$str[0]`。 | `return strtoupper($str[0]);` |
| 🔴 严重 | `decodeUnicode` | **PHP 8 致命错误**:使用已移除的 `create_function()`。存在安全风险且无法在 PHP 8+ 运行。 | 使用匿名函数 `function($matches) { ... }` 替代。 | `preg_replace_callback('/\\\\u([0-9a-f]{4})/i', fn($m) => mb_convert_encoding(pack('H*', $m[1]), 'UTF-8', 'UCS-2BE'), $str);` |
| 🔴 严重 | `doBatchFromTable` | **逻辑缺陷**:`foreach` 中 `$data` 为值拷贝,`$data[$k] = ...` 不会修改原 `$list`,导致函数返回未处理的数据。 | 直接操作 `$list[$k]` 或使用引用传递。 | `foreach ($list as $k => $data) { $list[$k] = doSingleFromTable($data); }` |
| 🔴 严重 | `getTimeInfo` | **逻辑缺陷**:`foreach` 中 `unset($item)` 仅销毁局部变量,无法从原数组中移除元素,过滤逻辑完全失效。 | 使用键值遍历或构建新数组。 | `foreach ($array as $key => $item) { if (!条件) unset($array[$key]); }` |
| 🔴 严重 | `passport_encrypt` | **密码学不安全**:使用 `srand()` 和 `rand()` 生成加密密钥,可被预测。不符合现代安全标准。 | 废弃该自定义算法,改用 `openssl_encrypt()` 或 `sodium_crypto_secretbox()`。 | `openssl_encrypt($str, 'AES-256-GCM', $key, OPENSSL_RAW_DATA, $iv);` |
| 🟠 警告 | `get_aliyun_redis_conn` 及所有 `rs_*` 函数 | **严重性能瓶颈**:每次调用都新建 Redis 连接、认证、选库并 `close()`。高并发下将耗尽连接池并拖垮 Redis。 | 采用单例模式或复用 CI 的 Redis 驱动。移除函数末尾的 `$obj->close()`,交由 PHP 垃圾回收或连接池管理。 | 见下方重构建议 |
| 🟠 警告 | `rs_set` / `rs_incrBy` 等 | **逻辑隐患**:`rs_set` 检查 `!$obj->exists()` 导致无法覆盖已有值(实为 `SETNX` 行为);`expireAt` 需绝对时间戳,若 `$expireTime` 为秒数应改用 `expire()`。 | 明确函数语义:若需覆盖则移除 `exists` 判断;统一使用 `$obj->expire($key, $seconds)` 设置相对过期时间。 | `$obj->set($key, $val); if($expireTime>0) $obj->expire($key, $expireTime);` |
| 🟠 警告 | `get_mac_by_url` | **潜在 Notice/Warning**:手动 `explode` 解析 URL 参数,未校验数组长度直接访问 `$check_url[1]`、`$vvs[0]` 易越界。 | 使用原生 `parse_url()` + `parse_str()` 替代手动拆分,增加 `isset()` 防御。 | `parse_str(parse_url($url, PHP_URL_QUERY) ?? '', $params); $id = $params['id'] ?? '';` |
| 🟠 警告 | `get_room_device_status` | **健壮性差**:超长 `if-elseif` 链直接访问 `$switch_list_arr['0']['state']`,缺失键时将触发大量 `Undefined index` 警告。 | 提取状态映射表,或使用空合并运算符 `??` 安全取值。 | `$state0 = $switch_list_arr['0']['state'] ?? null;` |
| 🟠 警告 | `curlRequest` / `asyncRequest` | **安全风险**:强制关闭 SSL 验证 `CURLOPT_SSL_VERIFYPEER = false`,易受中间人攻击(MITM)。 | 移除该配置或配置正确的 CA 证书路径。生产环境严禁关闭。 | `curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);` |
| 🟡 建议 | 文件顶部 | **结构不规范**:`defined('BASEPATH') OR exit(...)` 安全守卫放在第一个函数之后,且 `import()` 函数代码被意外截断。 | 将安全守卫移至文件首行;补全 `import()` 逻辑或改用 CI 原生 `$CI->load->helper()`。 | `<?php defined('BASEPATH') OR exit('No direct script access allowed');` |
| 🟡 建议 | 全局函数 | **规范缺失**:命名风格混用(驼峰/下划线),无类型声明,DocBlock 重复/错位,不符合 PSR-12。 | 统一使用 `snake_case`,添加 `@param`/`@return` 类型提示,PHP 7.4+ 建议添加标量类型声明。 | `function get_mac_by_url(string $family_server_id): string|false` |
---
## 3. 总结与行动建议
### 🚨 优先修复的关键问题(P0)
1. **移除硬编码凭证**:立即将 `alioss_*` 函数中的 `accessId`/`accessKey` 迁移至配置文件或环境变量,并轮换已泄露的密钥。
2. **修复 PHP 8 兼容性**:全局替换 `$str{0}` 为 `$str[0]`,移除 `create_function`,否则升级 PHP 版本将直接导致系统崩溃。
3. **修正数组操作 Bug**:修复 `doBatchFromTable` 和 `getTimeInfo` 中的无效赋值/删除逻辑,避免业务数据静默丢失。
4. **替换弱加密算法**:废弃 `passport_encrypt/decrypt`,迁移至 `openssl` 扩展,保障用户敏感数据安全。
### 🛠 后续重构与优化方向
1. **Redis 连接池化/单例化**:
当前每个 `rs_*` 函数独立建连是最大性能瓶颈。建议封装为单例类:
```php
class RedisPool {
private static $instance = null;
public static function getInstance($hostName = '', $dbId = 0) {
if (!self::$instance) {
self::$instance = get_aliyun_redis_conn($hostName, $dbId);
}
return self::$instance;
}
}
// 调用处改为:$redis = RedisPool::getInstance();
```
2. **职责拆分(SRP 原则)**:
该文件已严重违反单一职责原则。建议按领域拆分为:
- `redis_helper.php`(仅保留 Redis 封装)
- `oss_helper.php`(云存储操作)
- `security_helper.php`(加密、IP获取、短信)
- `format_helper.php`(时间、距离、排序、字符处理)
3. **框架适配说明**:
代码结构高度符合 **CodeIgniter 3** 规范(`get_instance()`, `BASEPATH`, `system/` 目录)。若 `phpci` 为内部定制框架,请确认其是否支持 PHP 8 及现代依赖注入。建议逐步将 Helper 中的模型加载 (`$CI->load->model()`) 移至 Controller 或 Service 层,避免 Helper 产生隐式依赖。
4. **引入静态分析工具**:
建议接入 `PHPStan` 或 `Psalm` 进行静态类型检查,配合 `PHP_CodeSniffer` 强制 PSR-12 规范,可在 CI/CD 流水线中拦截此类低级语法与逻辑错误。
> 💡 **提示**:若需针对某个具体函数(如 `get_mac_by_url` 或 `createRecordUrl`)进行深度重构或单元测试编写,可提供具体业务场景,我将输出完整可替换的代码实现。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779247795
|
1779247795
|
0
|
0
|
0
|
0
|
Edit
Delete
|