|
117
|
18
|
87
|
1
|
|
0
|
修改0416
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1778571415
|
1778573646
|
1778573646
|
0
|
0
|
0
|
Edit
Delete
|
|
118
|
18
|
88
|
1
|
|
0
|
修改0416
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1778571518
|
1779097445
|
1778573638
|
0
|
0
|
0
|
Edit
Delete
|
|
694
|
18
|
208
|
1
|
|
0
|
前端打包编译
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783991348
|
1783991356
|
1783991356
|
0
|
0
|
0
|
Edit
Delete
|
|
695
|
18
|
209
|
1
|
|
0
|
前端打包编译
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783991378
|
1783991391
|
1783991391
|
0
|
0
|
0
|
Edit
Delete
|
|
32
|
18
|
7
|
1
|
|
0
|
合并
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1774348913
|
1778573643
|
1778573643
|
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
|
|
159
|
18
|
111
|
1
|
|
0
|
合并0519最新
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1779154781
|
1779154927
|
1779154789
|
0
|
0
|
0
|
Edit
Delete
|
|
161
|
18
|
112
|
1
|
|
0
|
合并0519最新
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1779154837
|
1781141876
|
1779154849
|
0
|
0
|
0
|
Edit
Delete
|
|
26
|
18
|
1
|
1
|
|
0
|
合并111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1774345739
|
1774345823
|
1774345753
|
0
|
0
|
0
|
Edit
Delete
|
|
46
|
18
|
18
|
1
|
|
0
|
合并到主分支
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1775806102
|
1775806218
|
1775806125
|
0
|
0
|
0
|
Edit
Delete
|
|
708
|
21
|
320
|
1
|
|
0
|
套餐购买页“购买时长"页签根据后台设置显隐
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784871323
|
1784871331
|
1784871331
|
0
|
0
|
0
|
Edit
Delete
|
|
709
|
21
|
321
|
1
|
|
0
|
套餐购买页“购买时长"页签根据后台设置显隐
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784871361
|
1784871367
|
1784871367
|
0
|
0
|
0
|
Edit
Delete
|
|
615
|
22
|
75
|
1
|
|
0
|
开房套餐转房增加房态判断。
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1780972488
|
1780972586
|
1780972493
|
0
|
0
|
0
|
Edit
Delete
|
|
30
|
18
|
5
|
1
|
|
0
|
新分支提交
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1774348869
|
1774348877
|
1774348877
|
0
|
0
|
0
|
Edit
Delete
|
|
688
|
23
|
40
|
1
|
|
0
|
新增活动任务配置相关model
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782974732
|
1782974741
|
1782974741
|
0
|
0
|
0
|
Edit
Delete
|
|
291
|
6
|
9
|
5
|
|
0
|
治理上线 ②④: 恢复 CI 硬门禁(豁免感知) + 文档对账机制 + Phase2 单测全绿
|
## 模块治理摘要
- 模块:
- 战区:
- lane:
- 阶段:
- 分类:`模 ## 模块治理摘要
- 模块:
- 战区:
- lane:
- 阶段:
- 分类:`模块专项通过 / 工作区漂移 / 阻断`
- 结论:
- 战役卡:
- 验收卡:
- runner evidence bundle:
## 验证命令
| 命令 | 结果 | 备注 |
| --- | --- | --- |
| | | |
| | | |
| | | |
## 审计命中
- `audit:tenant`:
- `audit:events`:
- `audit:route-contract`:
- `audit:docs-single-source`:
- 如未跑全量,请说明原因:
## 前端 / 页面验收
- canonical 入口:
- smoke / auth-scope:
- alias / compat 回归:
## 残余风险
- 风险 1:
- 风险 2:
## 文档同步
- [ ] `CLAUDE.md`
- [ ] `AGENTS.md`
- [ ] `README.md`
- [ ] `GEMINI.md`
- [ ] 治理经验库 / 专项记录
## 口径确认
- [ ] 本 PR 只宣称模块级通过,不把模块结果外推为工作区全绿
- [ ] 若存在工作区漂移,已明确标记且未误记到当前模块
- [ ] 若存在热修 lane,已与全域补证据 / build-out lane 隔离
...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1779504052
|
1779504064
|
1779504064
|
0
|
0
|
0
|
Edit
Delete
|
|
680
|
21
|
311
|
1
|
|
0
|
测试
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782697976
|
1782697982
|
1782697982
|
0
|
0
|
0
|
Edit
Delete
|
|
681
|
21
|
312
|
1
|
|
0
|
测试
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782698000
|
1782698023
|
1782698023
|
0
|
0
|
0
|
Edit
Delete
|
|
698
|
22
|
88
|
1
|
|
0
|
订台汇总test
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784696635
|
1784696641
|
1784696641
|
0
|
0
|
0
|
Edit
Delete
|
|
675
|
21
|
310
|
1
|
|
0
|
退款api
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1781763061
|
1781763086
|
1781763086
|
0
|
0
|
0
|
Edit
Delete
|
|
678
|
22
|
85
|
1
|
|
0
|
退款用户加手机号显示
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782697385
|
1782697392
|
1782697392
|
0
|
0
|
0
|
Edit
Delete
|
|
679
|
22
|
86
|
1
|
|
0
|
退款用户加手机号显示
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782697413
|
1782697422
|
1782697422
|
0
|
0
|
0
|
Edit
Delete
|
|
609
|
23
|
29
|
1
|
|
0
|
门店管理充值
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1780971405
|
1780971519
|
1780971415
|
0
|
0
|
0
|
Edit
Delete
|
|
610
|
23
|
30
|
1
|
|
0
|
门店管理充值
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1780971458
|
1780971538
|
1780971538
|
0
|
0
|
0
|
Edit
Delete
|
|
612
|
23
|
32
|
1
|
|
0
|
门店管理充值
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1780971913
|
1780972100
|
1780972100
|
0
|
0
|
0
|
Edit
Delete
|
|
700
|
23
|
42
|
1
|
|
0
|
需求 小程序设置导出 16583
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784696709
|
1784696723
|
1784696723
|
0
|
0
|
0
|
Edit
Delete
|
|
702
|
23
|
43
|
1
|
|
0
|
需求 小程序设置导出 16583
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784772728
|
1784772735
|
1784772735
|
0
|
0
|
0
|
Edit
Delete
|
|
684
|
21
|
313
|
1
|
|
0
|
需求 小程序,h5默认灯光 16498
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782720186
|
1782720207
|
1782720207
|
0
|
0
|
0
|
Edit
Delete
|
|
685
|
21
|
314
|
1
|
|
0
|
需求 小程序,h5默认灯光 16498
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782720278
|
1782720287
|
1782720287
|
0
|
0
|
0
|
Edit
Delete
|
|
690
|
25
|
4
|
1
|
|
0
|
需求 时序设备api控制 16449
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783048848
|
1783048853
|
1783048853
|
0
|
0
|
0
|
Edit
Delete
|
|
696
|
21
|
316
|
1
|
|
0
|
需求 暂停屏保 16512
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783991980
|
1783991987
|
1783991987
|
0
|
0
|
0
|
Edit
Delete
|
|
699
|
18
|
210
|
1
|
|
0
|
需求 灯光配置增加中控类型
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784696664
|
1784696673
|
1784696673
|
0
|
0
|
0
|
Edit
Delete
|
|
701
|
21
|
318
|
1
|
|
0
|
需求 续费弹窗语音提醒 16618
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784696808
|
1784696845
|
1784696845
|
0
|
0
|
0
|
Edit
Delete
|
|
604
|
21
|
276
|
1
|
|
0
|
需求 订单回执
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1780970563
|
1780970680
|
1780970571
|
0
|
0
|
0
|
Edit
Delete
|
|
605
|
21
|
277
|
1
|
|
0
|
需求 订单回执
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1780970586
|
1780970601
|
1780970601
|
0
|
0
|
0
|
Edit
Delete
|
|
682
|
18
|
205
|
1
|
|
0
|
需求 赠时报表 16382
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782698462
|
1782698472
|
1782698472
|
0
|
0
|
0
|
Edit
Delete
|
|
683
|
18
|
206
|
1
|
|
0
|
需求 赠时报表 16382
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782698509
|
1782698569
|
1782698569
|
0
|
0
|
0
|
Edit
Delete
|
|
686
|
22
|
87
|
1
|
|
0
|
需求 门店名称限制 16489
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782720336
|
1782720353
|
1782720353
|
0
|
0
|
0
|
Edit
Delete
|
|
689
|
18
|
207
|
1
|
|
0
|
需求 门店名称限制 16489
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782976300
|
1782976308
|
1782976308
|
0
|
0
|
0
|
Edit
Delete
|
|
703
|
21
|
319
|
1
|
|
0
|
需求-H5点击下载不跳转
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784772792
|
1784772800
|
1784772800
|
0
|
0
|
0
|
Edit
Delete
|
|
676
|
23
|
38
|
1
|
|
0
|
需求-续费二维码
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782357069
|
1782357078
|
1782357078
|
0
|
0
|
0
|
Edit
Delete
|
|
677
|
23
|
39
|
1
|
|
0
|
需求-续费二维码
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782357094
|
1784802050
|
1784802050
|
0
|
0
|
0
|
Edit
Delete
|
|
687
|
21
|
315
|
1
|
|
0
|
预订开房多过滤该包厢上一单已关房的账单时间
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782973124
|
1782973131
|
1782973131
|
0
|
0
|
0
|
Edit
Delete
|
|
697
|
21
|
317
|
1
|
|
0
|
预订开房多过滤该包厢上一单已关房的账单时间
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783992006
|
1783992023
|
1783992023
|
0
|
0
|
0
|
Edit
Delete
|
|
383
|
23
|
21
|
1
|
|
0
|
🔍 代码审查报告:admin - Merge branch 'admin-260519 🔍 代码审查报告:admin - Merge branch 'admin-260519' into admin...
|
## 自动代码审查报告
**分支**: admin
**提交**: `84e869c16962cb ## 自动代码审查报告
**分支**: admin
**提交**: `84e869c16962cb080a19e8a1d4a59c17fff52742`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-27 16:44:33
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10
- **总体评价**:代码实现了较为完整的业务闭环(列表查询、退款、导出等),但存在**高危安全漏洞**、**架构违规**及**事务缺失**等核心问题。整体风格偏向老旧的 CodeIgniter 3 写法,缺乏现代 PHP 特性(类型声明、常量定义、异常处理),且 Model 层承担了过多业务逻辑,违反单一职责原则。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_songs_sales_pay_log_model.php` / `get_list()` | **SQL 注入漏洞**:`$where['where']` 直接拼接用户输入的 `$title`,未进行转义或参数绑定,攻击者可构造恶意输入破坏查询或窃取数据。 | 废弃原生字符串拼接,改用框架查询构建器的 `like()` 或 `group_start()/group_end()` 链式调用,底层自动处理转义。 | `$this->db->group_start()->like('log._title', $title)->or_like('book._group_package_name', $title)->or_like('book._group_platform_name', $title)->group_end();` |
| 🔴 严重 | `Ahead_book_order_change_pay_log_model.php` / `refund()` | **缺失数据库事务**:退款流程涉及状态更新、会员余额扣减、外部微信退款调用。未包裹在事务中,若中间环节失败,将导致“状态已改但钱未退”的数据不一致灾难。 | 使用 `$this->db->trans_start();` 包裹核心逻辑,失败时调用 `$this->db->trans_rollback();`,成功则 `$this->db->trans_complete();`。 | `见下方重构示例` |
| 🔴 严重 | `Ahead_preorder_order_model.php` / `export()` | **违反 MVC 架构**:Model 层直接使用 `exit('成功')` 终止脚本执行,破坏框架生命周期,导致后续中间件、日志记录、响应格式化全部失效。 | 移除 `exit()`,Model 仅负责返回数据或状态,由 Controller 层统一处理输出或调用框架导出组件。 | `return ['status' => true, 'msg' => '导出任务已提交'];` |
| 🟠 警告 | `Ahead_songs_sales_pay_log_model.php` / `get_list()` | **N+1 查询性能瓶颈**:在 `foreach` 循环中逐条调用 `$this->ahead_user_reward_model->get_reward_name()`,数据量达百级时将产生数百次冗余查询。 | 提前收集所有 `reward_id`,使用 `where_in` 批量查询,再在内存中通过 `array_column` 映射。 | `见下方优化示例` |
| 🟠 警告 | 多个文件顶部 | **全局实例化反模式**:`$CI = &get_instance();` 写在类外部,文件被 `include/require` 时即执行,浪费资源且易在 CLI 或单元测试中引发未初始化错误。 | 移至类的 `__construct()` 中,或依赖父类 `Simple_model` 统一初始化。 | `public function __construct() { parent::__construct(); $this->CI =& get_instance(); }` |
| 🟠 警告 | 多个文件 / `refund()` / `wx_refund()` | **硬编码敏感盐值**:`md5(... . '1441600902')` 使用固定字符串作为退款签名盐,易被逆向分析或重放攻击。 | 将盐值移至配置文件或环境变量,或使用更安全的 `hash_hmac('sha256', $data, $salt)`。 | `md5($refund_info['log_id'] . $refund_info['trade_no'] . config_item('refund_salt'))` |
| 🟡 建议 | 全局 | **魔法数字/字符串泛滥**:大量使用 `1`, `3`, `4`, `8`, `9` 等硬编码,可读性差且后期维护极易出错。 | 定义类常量或枚举(PHP 8.1+),如 `const STATUS_PAID = 1; const PLATFORM_WECHAT = 1;`。 | `const PAY_PLATFORM_WECHAT = 1; const STATUS_REFUNDED = 4;` |
| 🟡 建议 | 全局 | **缺乏现代 PHP 类型声明**:方法参数与返回值未声明类型,不符合 PSR-12 规范,IDE 无法提供静态检查与自动补全。 | 补充 `array`, `int`, `string`, `bool` 等类型提示,建议在文件头部启用 `declare(strict_types=1);`。 | `public function get_list(array $params, int $page = 1, int $pageSize = 20): array` |
> 💡 **框架适配说明**:代码结构高度契合 CodeIgniter (CI3/CI4) 规范。若 `phpci` 为自研或定制分支,上述事务管理、查询构建器及生命周期建议同样适用。若框架已内置 Service 容器,建议将 `$this->load->model()` 替换为依赖注入。
## 3. 总结与行动建议
### 🚨 优先修复的关键问题(P0/P1)
1. **修复 SQL 注入**:立即替换 `Ahead_songs_sales_pay_log_model::get_list()` 中的原生 `where` 拼接,使用框架提供的安全查询方法。
2. **补充事务控制**:为 `Ahead_book_order_change_pay_log_model::refund()` 及所有涉及多表更新、资金变动的逻辑添加 `$this->db->trans_start()/trans_complete()` 机制,确保 ACID 特性。
3. **移除 Model 中的 `exit()`**:将 `Ahead_preorder_order_model::export()` 的终止逻辑上移至 Controller,保持 Model 纯净。
### 🛠 后续重构与优化方向
1. **架构分层(Model → Service)**:当前 Model 承担了过多业务逻辑(如退款路由、会员积分计算、外部 API 调用)。建议抽取 `RefundService`、`ExportService`,Model 仅保留数据访问(CRUD)职责。
2. **统一异常处理**:全局函数 `throwError()` 属于老旧写法,建议全面替换为 PHP 原生 `throw new \RuntimeException('msg')`,配合框架全局异常处理器统一返回 JSON/视图。
3. **性能优化清单**:
- 批量查询替代循环查库(N+1 问题)。
- 大数据量导出改用游标(Cursor)或分块(Chunk)写入,避免 `memory_limit` 溢出。
- 将频繁调用的 `load->model()` 移至构造函数或使用框架自动加载。
4. **代码规范升级**:引入 PHPStan/Psalm 静态分析工具,强制要求类型声明、常量定义及 PSR-12 格式化,提升团队协作效率与代码可维护性。
> ⚠️ **局限性说明**:本次审查基于提供的代码片段。由于未提供 `Simple_model` 基类实现、`throwError` 函数定义及 `phpci` 框架完整上下文,部分建议(如事务回滚机制、查询构建器语法)需根据实际框架底层实现进行微调。建议结合官方文档验证后实施。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779871473
|
1779871473
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
160
|
23
|
4
|
1
|
|
0
|
🔍 代码审查报告:admin - Merge pull request '0519' 🔍 代码审查报告:admin - Merge pull request '0519' (#2) from admin-260519 i...
|
## 自动代码审查报告
**分支**: admin
**提交**: `2e86ce11e39f68 ## 自动代码审查报告
**分支**: admin
**提交**: `2e86ce11e39f682fa48d5c431249a75689d1a503`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-19 09:40:23
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了节假日管理与门店临时授权日志的核心业务,基础逻辑链路完整。但存在多处架构规范违规(如模型文件顶部直接调用框架实例)、数据一致性风险(缺失事务控制)、性能隐患(PHP层全量拉取比对日期重叠)以及前端安全隐患(CSRF缺失、老旧依赖)。整体需进行规范化重构与安全性加固。
- **风险等级**:🔴 高
> 📌 **框架说明**:提交代码的目录结构、`$this->load->model()`、`get_instance()`、`BASEPATH` 等特征高度符合 **CodeIgniter 3 (CI3)** 框架规范,而非 `phpci`。以下审查将基于 CI3 官方最佳实践进行。若为内部定制框架,请结合其生命周期调整加载方式。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_holiday_manage_model.php`: 3-4<br>`Ahead_shop_account_temp_auth_log_model.php`: 2-3 | **模型文件顶部直接调用 `get_instance()` 与 `load->model()`**。CI3 在解析类文件时框架可能尚未完全初始化,极易触发 `Call to undefined function get_instance()` 致命错误,且破坏框架单例与自动加载机制。 | 移除文件顶部代码,将依赖加载移至类的 `__construct()` 构造函数中。 | ```php<br>public function __construct()<br>{<br> parent::__construct();<br> $this->load->model('Simple_model');<br>}<br>``` |
| 🔴 严重 | `Ahead_holiday_manage_model.php`: `set_data`<br>`Ahead_shop_account_temp_auth_log_model.php`: `set_temp_auth_expire_time` | **多步数据库操作缺失事务控制**。涉及查询、更新、插入多个步骤,若中间环节失败(如网络抖动、约束冲突),将导致数据处于不一致状态(如账号已更新但日志未写入)。 | 使用 CI3 事务机制包裹核心写操作,失败时自动回滚并抛出异常。 | ```php<br>$this->db->trans_start();<br>$this->ahead_shop_account_model->update($update, $where);<br>$this->insert($log_data);<br>$this->db->trans_complete();<br>if ($this->db->trans_status() === FALSE) {<br> throwError('操作失败,数据已回滚');<br>}<br>``` |
| 🔴 严重 | `showFixRoomData.php`: JS 部分 | **AJAX POST 请求未携带 CSRF Token**。若后台未做白名单豁免,请求将被安全组件拦截;若已豁免,则存在跨站请求伪造风险,攻击者可诱导管理员执行恶意修复操作。 | 在 AJAX `data` 或 `headers` 中注入 CI 的 CSRF 凭证。 | ```javascript<br>var params = {<br> "family_server_id": family_server_id,<br> "<?php echo $this->security->get_csrf_token_name(); ?>": "<?php echo $this->security->get_csrf_hash(); ?>"<br>};<br>``` |
| 🟠 警告 | `Ahead_holiday_manage_model.php`: `_check_repeat_data` | **日期重叠校验在 PHP 层循环执行**。使用 `SELECT` 拉取全年所有未删除记录后在内存中遍历比对。数据量增长时将导致严重的内存占用与 CPU 瓶颈。 | 将区间交集逻辑下推至 SQL 层,利用 `BETWEEN` 或区间公式直接过滤,仅返回冲突记录。 | ```sql<br>WHERE _year = ? AND _status != -1 AND _id != ? <br>AND (_start_date <= ? AND _end_data >= ?)<br>``` |
| 🟠 警告 | `Ahead_holiday_manage_model.php`: 多处 | **字段名疑似拼写错误:`_end_data`**。代码中混用 `_end_data` 与别名 `end_date`,若数据库实际字段为 `_end_date`,将导致 `Unknown column` 错误或数据写入错位。 | 全局核对数据库 Schema,统一修正为 `_end_date`(假设原意为 date)。 | `$data['_end_date'] = strtotime($param['end_date']);` |
| 🟠 警告 | `Ahead_holiday_manage_model.php`: `set_data` | **日期处理冗余且易丢失精度**:`strtotime(date('Y-m-d', strtotime($param['start_date'])))`。多次类型转换无实际意义,且 `date()` 默认使用服务器时区,可能引发跨时区业务偏差。 | 直接使用 `strtotime()` 或 `DateTime` 处理,去除中间 `date()` 转换。 | `$data['_start_date'] = strtotime($param['start_date']);` |
| 🟠 警告 | `Ahead_holiday_manage_model.php`: `get_list` | **引用遍历后未释放变量**:`foreach ($data as &$v)` 修改数组后未 `unset($v)`。在 PHP 中残留的 `$v` 引用可能意外污染后续同名变量或导致内存泄漏。 | 循环结束后立即解除引用。 | `foreach ($data as &$v) { ... } unset($v);` |
| 🟡 建议 | `HolidayManage.php`: 6 | **使用 `include` 手动引入父控制器**。不符合 CI 自动加载规范,且 `include` 失败时仅报 Warning,可能导致类未定义却继续执行。 | 改用 `require_once` 或依赖 CI 的 `spl_autoload_register` 机制。 | `require_once FCPATH . 'application/controllers/PcServer.php';` |
| 🟡 建议 | `showFixRoomData.php`: 外部 JS | **引入 jQuery 1.8.2 版本过旧**(2012年发布),存在已知 XSS 绕过漏洞,且硬编码外部 CDN 链接,网络波动时直接影响运维工具可用性。 | 升级至 jQuery 3.x LTS 版本,并将静态资源本地化部署至项目 `assets/` 目录。 | `<script src="/static/js/jquery-3.7.1.min.js"></script>` |
---
## 3. 总结与行动建议
### 🚨 优先修复的关键问题
1. **修复模型加载方式**:立即移除所有模型文件顶部的 `get_instance()` 与 `load->model()`,统一迁移至 `__construct()`。这是导致线上 `Fatal Error` 的高频诱因。
2. **补充数据库事务**:为 `set_data` 与 `set_temp_auth_expire_time` 方法包裹 `$this->db->trans_start()/trans_complete()`,确保多表写入的原子性。
3. **修正字段拼写与日期逻辑**:全局搜索替换 `_end_data` 为 `_end_date`(需与 DBA 确认表结构),并简化 `strtotime` 冗余调用。
4. **前端 CSRF 防护**:在 `showFixRoomData.php` 的 AJAX 请求中注入 CSRF Token,或确认后台路由已正确配置安全过滤策略。
### 🛠 后续重构与优化方向
- **SQL 逻辑下推**:将 `_check_repeat_data` 的 PHP 循环比对改写为单条 SQL 查询。利用 `WHERE (start1 <= end2 AND end1 >= start2)` 标准区间交集公式,可提升查询效率 10 倍以上。
- **控制器职责收敛**:`HolidayManage.php` 中直接透传 `$this->params` 至 Model,建议在 Controller 层增加基础参数过滤(如 `trim()`, `htmlspecialchars()` 或 CI 的 `xss_clean()`),避免脏数据污染业务层。
- **前端工程化**:将内联 CSS/JS 抽离为独立文件;废弃 jQuery 1.x,迁移至现代前端构建流程(如 Vite/Webpack),提升可维护性与安全性。
- **异常处理规范化**:全局 `throwError()` 若为自定义函数,建议逐步替换为 PHP 原生 `throw new \Exception()` 或 CI 的 `show_error()`,以便统一接入日志监控与错误追踪系统。
> 💡 **局限性说明**:本次审查未包含 `web/backstage_pc/dist/js/` 下的压缩混淆文件(属构建产物,非源码),且未获取 `Simple_model`、`PcServer` 及自定义辅助函数(如 `get_page_suit`, `throwError`)的实现细节。若这些基类存在特殊设计,请结合其内部逻辑微调上述建议。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779154823
|
1779154823
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
611
|
23
|
31
|
1
|
|
0
|
🔍 代码审查报告:admin - Merge pull request '门店管理充值 🔍 代码审查报告:admin - Merge pull request '门店管理充值' (#29) from admin-26051...
|
## 自动代码审查报告
**分支**: admin
**提交**: `445e5eeab84a50 ## 自动代码审查报告
**分支**: admin
**提交**: `445e5eeab84a50745522a152332059e695f39fe2`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-06-09 10:18:39
---
## 📋 审查摘要
- **变更文件数**: 5 (其中2个为 Webpack 压缩产物,仅审查 3 个 PHP 文件)
- **严重问题**: 2
- **高危问题**: 4
- **中危问题**: 2
- **建议优化**: 3
## 🐛 发现的问题
### <font color="red">[跨文件调用] 模型名称拼写错误导致类无法加载</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: `application/controllers/Room.php`
- **行号**: 约 248, 268
- **问题描述**: 代码中加载了 `Ahead_famaily_version_model` 和 `Ahead_famaily_product_model`。`famaily` 为明显拼写错误(应为 `family`)。在 CodeIgniter 中,`$this->load->model()` 会严格根据文件名和类名进行映射,拼写错误将直接导致 `Fatal error: Class not found` 或模型加载失败。
- **修复建议**:
```php
// 修正拼写
$this->load->model('Ahead_family_version_model');
$this->load->model('Ahead_family_product_model');
```
### <font color="red">[跨文件调用] 调用了未定义的全局函数/常量</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: `application/models/Ahead_room_renewal_mini_qrcode_model.php`
- **行号**: 约 25, 28, 30
- **问题描述**: 模型中直接调用了 `getUnlimitedWxacode()`、`do_log()`、`alioss_internal_addObject_by_content()` 以及常量 `DEBUG_VERSION`。这些函数/常量未在提供的文件结构中定义,也未在模型顶部通过 `helper()` 加载。若未全局自动加载,将触发 `Call to undefined function` 致命错误。
- **修复建议**:
1. 确认这些函数是否属于自定义 Helper,在模型顶部或控制器中显式加载:`$this->load->helper('wechat_helper');` 等。
2. 若为全局函数,建议在项目入口或 `autoload.php` 中配置自动加载,避免隐式依赖。
### [安全隐患] SSH连接验证逻辑被硬编码绕过
- **严重程度**: 高危
- **文件**: `application/controllers/Room.php`
- **行号**: 约 380
- **问题描述**: `connectSSH()` 方法中存在 `if ($is_success || true) {//临时打开`。该条件永远为 `true`,导致前端无需通过任何登录验证即可直接建立 SSH 会话并获取 `session_id`。这是极其严重的安全后门。
- **修复建议**:
```php
// 移除硬编码绕过,严格依赖验证结果
if ($is_success) {
// 创建SSH会话逻辑...
}
```
### [安全隐患] 命令注入风险 (shell_exec 执行用户输入)
- **严重程度**: 高危
- **文件**: `application/controllers/Room.php`
- **行号**: 约 430, 448
- **问题描述**: `executeSSHCommand()` 使用 `shell_exec()` 拼接并执行系统命令。虽然使用了 `escapeshellarg()`,但 `$command` 和 `$port` 均来自用户输入 (`$this->params`)。攻击者仍可能通过特殊字符或命令链绕过转义,导致服务器被完全控制。
- **修复建议**:
1. **强烈建议**弃用 `shell_exec`,改用 PHP 原生 `ssh2` 扩展 (`ssh2_connect`, `ssh2_exec`),从底层隔离命令注入风险。
2. 若必须使用 `shell_exec`,需对 `$command` 实施严格的白名单校验,禁止传入包含 `;`, `|`, `&`, `$`, `` ` `` 等元字符的指令。
### [逻辑 BUG] 数组参数未过滤直接拼接 SQL WHERE 条件
- **严重程度**: 高危
- **文件**: `application/controllers/Room.php`
- **行号**: 约 118
- **问题描述**: 在 `upRoomVersion()` 中:
```php
if (is_array($room_id)) {
$where = "_id in (" . implode(",", $room_id) . ")";
}
```
直接将数组元素拼接为 SQL 字符串,未进行类型转换或转义。若 `$room_id` 包含非数字或恶意字符串,将导致 SQL 语法错误或 SQL 注入。
- **修复建议**:
使用 CI Query Builder 的安全方法,或在拼接前强制类型转换:
```php
$room_id = array_map('intval', $room_id); // 强制转为整型
$where = "_id IN (" . implode(",", $room_id) . ")";
```
### [代码质量] 直接使用 $_SESSION 绕过 CI Session 机制
- **严重程度**: 中危
- **文件**: `application/controllers/Room.php`
- **行号**: 约 385, 415
- **问题描述**: 代码直接读写 `$_SESSION['ssh_sessions']`。CodeIgniter 的 Session 库负责加密、序列化、防篡改及多驱动存储(DB/Redis/Files)。直接操作原生 `$_SESSION` 可能导致会话数据未加密、无法跨请求同步或触发 `Headers already sent` 警告。
- **修复建议**:
使用 CI 标准 Session API:
```php
$this->load->library('session');
$this->session->set_userdata('ssh_sessions', $sessions_data);
$ssh_info = $this->session->userdata('ssh_sessions')[$session_id];
```
### [代码质量] 版本更新方法存在大量重复逻辑
- **严重程度**: 中危
- **文件**: `application/controllers/Room.php`
- **行号**: `upRoomVersion`, `upRoomVersionByMerchant`, `upRoomVersionByShop`, `upRoomVersionByAll`
- **问题描述**: 四个方法中关于版本校验 (`new_ktv_song_version`/`new_ktv_singer_version` 存在性检查)、`song_limit_time` 时间戳转换、`where` 条件拼接、模型加载逻辑高度重复(重复率 >70%)。违反 DRY 原则,后期维护极易遗漏同步修改。
- **修复建议**: 提取公共逻辑至私有方法 `private function buildVersionUpdateQuery($params, $scope)`,各方法仅负责组装特定作用域的过滤条件后调用。
## ✅ 代码亮点
1. **模型继承规范**:`Ahead_room_renewal_mini_qrcode_model` 和 `Ahead_family_servers_model` 均正确继承自 `Simple_model`,符合项目基础架构设计。
2. **防御性编程**:在 `connectSSH` 中尝试了多种返回格式兼容判断 (`result_code`, `code`, `result` 字段),提升了与第三方/旧版接口对接的鲁棒性。
3. **SSH 密钥权限控制**:在 Linux 环境下主动执行 `@chmod($key_file, 0600)`,符合 SSH 私钥安全最佳实践。
## 📝 总体建议
1. **立即修复安全后门**:`|| true` 硬编码绕过必须作为 P0 级问题立即移除,否则生产环境 SSH 将完全暴露。
2. **统一模型命名与加载**:全面排查 `famaily` 拼写错误,并建议在 `application/config/autoload.php` 中统一配置常用 Helper 和基础 Model,减少隐式依赖导致的 `undefined function/class` 错误。
3. **重构 SSH 执行模块**:当前基于 `shell_exec` 的 SSH 方案维护成本高且安全隐患大。建议迁移至 `phpseclib/phpseclib` 或 PHP `ssh2` 扩展,实现纯 PHP 层面的安全连接与命令执行。
4. **JS 文件说明**:提供的 `chunk-vendors.*.js` 和 `index.*.js` 为 Webpack 压缩打包产物,已丢失源码结构,无法进行有效静态审查。建议后续提交变更时提供对应的 `.vue`/`.js` 源码文件。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780971519
|
1780971519
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
146
|
23
|
1
|
1
|
|
0
|
🔍 代码审查报告:admin-260519 - 0519
|
## 自动代码审查报告
**分支**: admin-260519
**提交**: `edbb549 ## 自动代码审查报告
**分支**: admin-260519
**提交**: `edbb549c7b70c9d07787ab94d151ba9a498760b9`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-18 18:03:34
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:代码整体遵循了 CodeIgniter 3.x 的基础架构模式,业务逻辑覆盖较全,但在**数据一致性、安全防御、性能瓶颈及代码规范**方面存在明显隐患。部分核心模型存在硬编码状态机、非原子性缓存操作及潜在 SQL 拼接风险。前端编译文件(JS)已超出 PHP 审查范围,本次仅针对 PHP 后端代码进行深度评估。
- **风险等级**:🟠 中(存在逻辑缺陷与潜在安全/性能隐患,需优先修复)
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_admin_work_orders_manage_model.php`<br>`edit()` 方法 | **逻辑错误/数组越界风险**:记录日志时错误使用了 `$data['_detail']` 作为优先级数组的键,应为 `$data['_priority']`。会导致日志记录异常或 PHP Warning。 | 修正键名引用,确保数组索引与业务字段对应。 | `// 错误<br>$this->priority[$data['_detail']]<br><br>// 修正<br>$this->priority[$data['_priority']]` |
| 🔴 严重 | `Ahead_agent_authenticate_model.php`<br>`batch_modify_authorization_time()` | **SQL 注入风险**:使用字符串拼接构造 `IN` 条件。若 `array_column` 返回的数据未严格过滤,将导致 SQL 注入。 | 使用 CI 查询构建器的 `where_in()` 方法,由框架自动处理转义。 | `$this->db->where_in('_family_server_id', array_column($data, '_family_server_id'));<br>$this->db->update($this->table_name, $update_data);` |
| 🟠 警告 | `CommunalShop.php`<br>`exportPayLogList()` | **输入过滤缺失/规范不一致**:直接使用 `$_GET` 获取参数,未使用 CI 的输入过滤机制,且与同控制器其他方法使用 `$this->params` 不一致。 | 统一使用 `$this->input->get()` 或框架封装的请求对象,并增加基础类型校验。 | `$params = $this->input->get(null, true);<br>$data = $this->ahead_songs_sales_pay_log_model->get_list($params, true);` |
| 🟠 警告 | `CommunalShop.php`<br>`payLogRefund()` | **重复响应/流程隐患**:在 `if` 块内调用 `success_response()` 后未 `return`,导致方法末尾再次执行 `success_response()`,可能引发重复输出或 Header 冲突。 | 在内部成功响应后显式 `return`,确保单一出口。 | `if (is_array($res) && ...) {<br> // ... 事务逻辑<br> return $this->success_response();<br>}<br>$this->success_response();` |
| 🟠 警告 | `Ahead_admin_work_orders_manage_model.php`<br>`save_customer_info()` | **并发竞争条件/性能瓶颈**:Redis 采用 `GET -> JSON解码 -> 修改 -> JSON编码 -> SET` 模式,非原子操作。高并发下极易丢失数据或覆盖他人写入。 | 改用 Redis `SADD`(集合)或 `HSET`(哈希)结构,或使用 Lua 脚本保证原子性。 | `$redis->sAdd("work_order_customer_info:{$admin_id}", $customer_name);<br>// 读取时直接 SMEMBERS 即可,无需 JSON 序列化` |
| 🟡 建议 | `Ahead_admin_work_orders_manage_model.php`<br>`deal()` 方法 | **类型比较不规范**:`$status` 已通过 `intval()` 转为整型,但后续使用 `$status != '6'` 进行字符串弱类型比较,易引发隐式转换隐患。 | 统一使用严格比较 `!==`,或定义状态常量替代魔法数字。 | `const STATUS_REMARK = 6;<br>if ($status !== self::STATUS_REMARK && $status !== 16) { ... }` |
| 🟡 建议 | 全局多处 | **硬编码与可读性差**:大量使用 `256` 代替 `JSON_UNESCAPED_UNICODE`;状态流转使用硬编码数组 `(-1, 3, 7, 8)`;存在大量过期注释(如 `//add by nan 191205`)。 | 替换为 PHP 内置常量;提取状态机为类常量或枚举;清理无用注释,保持代码整洁。 | `json_encode($data, JSON_UNESCAPED_UNICODE);<br>// 状态常量示例<br>const ALLOWED_STATUS_TRANSITION = [-1, 3, 7, 8];` |
| 🟡 建议 | 所有 Model 文件顶部 | **框架冗余代码**:`$CI = &get_instance(); $CI->load->model('Simple_model');` 在 CI3 模型中是冗余的,模型内部已继承 `$this` 且自动加载基类。 | 移除顶部冗余代码,保持模型纯净。 | `// 删除顶部两行<br>class Ahead_xxx_model extends Simple_model { ... }` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复 `edit()` 方法中的键名错误**:`$data['_detail']` 误用为优先级索引,直接影响操作日志的准确性,需立即修正。
2. **消除 SQL 拼接隐患**:将 `batch_modify_authorization_time` 中的字符串拼接 `IN` 条件替换为 CI Query Builder 的 `where_in()`,彻底阻断 SQL 注入路径。
3. **解决 Redis 并发写入问题**:`save_customer_info` 的 `GET-SET` 模式在工单高频提交场景下必然出现数据覆盖。建议迁移至 Redis `Set` 结构或引入分布式锁/Lua 脚本。
4. **规范控制器响应流**:修复 `payLogRefund` 的双重响应问题,确保 HTTP 响应唯一性。
### 🛠 后续重构与优化方向
1. **状态机与常量治理**:当前业务状态(如工单状态、授权状态)散落在数组和硬编码中。建议引入 PHP 8.1+ `enum` 或定义独立的状态常量类,配合状态模式(State Pattern)管理流转逻辑,降低维护成本。
2. **统一输入校验层**:控制器中混用 `$_GET`、`$this->params` 及未校验的数组索引。建议在 `PcServer` 基类中封装统一的 `validateInput()` 方法,结合 CI 的 `Form_validation` 或第三方验证库(如 `respect/validation`)进行前置拦截。
3. **数据库查询优化**:`get_list` 方法中针对 `department_id` 的查询采用了“先查用户表再拼 `where_in`”的模式。建议改为 `JOIN` 子查询或直接使用 `EXISTS`,减少 PHP 层内存占用与网络往返。
4. **规范与 PSR-12 对齐**:清理历史注释,统一方法命名风格(CI 传统为蛇形,但 PSR-12 推荐驼峰,建议团队内部统一标准),将 `json_encode($data, 256)` 等魔法数字替换为语义化常量。
> 💡 **框架说明**:您提供的代码结构高度符合 **CodeIgniter 3.x** 规范(如 `BASEPATH`、`$this->load->model()`、`FCPATH` 等),而非 `phpci`(通常指 PHP Continuous Integration 工具或特定轻量框架)。本次审查基于 CI3 最佳实践与 PSR-12 标准进行。若项目确为定制框架,请补充核心基类(如 `PcServer`、`Simple_model`)的源码以便进行更精准的架构级评估。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779098614
|
1779098614
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
241
|
23
|
7
|
1
|
|
0
|
🔍 代码审查报告:admin-260519 - 1
|
## 自动代码审查报告
**分支**: admin-260519
**提交**: `a6cca50 ## 自动代码审查报告
**分支**: admin-260519
**提交**: `a6cca50e0b530716e2507fe986ad2f05616d329b`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-05-20 15:31:53
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:业务逻辑覆盖较完整,退款流程与多端状态同步考虑较为细致。但存在**高危 SQL 注入风险**、**N+1 查询性能瓶颈**、**事务与异常处理不规范**及**代码风格严重偏离 PSR-12** 等问题。整体可维护性与安全性亟待提升。
- **风险等级**:🔴 高
> 📌 **框架说明**:基于 `system/` 与 `application/` 目录结构,判断 `phpci` 疑似为 CodeIgniter 3/4 的定制版或内部框架。以下审查基于标准 CI 架构与 PHP 现代最佳实践,若为自研框架,请对照其官方文档调整组件调用方式。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `refund()` 方法 | **SQL 注入风险**:多处使用字符串直接拼接构造 `WHERE` 与 `UPDATE` 语句(如 `'_merchant_id=' . $pay_log['_merchant_id']`、`'_order_refund_amount=_order_refund_amount+' . $pay_log['_actual_pay']`)。若 `Simple_model` 未做底层转义,将导致严重数据泄露或篡改。 | 统一使用框架 Query Builder 或参数绑定,禁止手动拼接 SQL。数值型字段强制类型转换。 | `$this->db->where('_merchant_id', (int)$pay_log['_merchant_id'])<br>->set('_order_refund_amount', '_order_refund_amount + ' . (float)$pay_log['_actual_pay'], FALSE)<br>->update('table_name');` |
| 🔴 严重 | `refund()` 方法 | **弱加密与硬编码盐值**:`md5($log_info['_id'] . $log_info['_trade_no'] . '1441600902')` 使用固定明文盐值,易被彩虹表碰撞或逆向,不符合支付安全规范。 | 使用 `hash_hmac` 配合独立密钥,或调用框架加密组件。密钥应存放于环境变量或配置中心。 | `hash_hmac('sha256', $log_info['_id'].$log_info['_trade_no'], config_item('refund_secret_key'))` |
| 🟠 警告 | `get_list()` 方法 | **N+1 查询性能瓶颈**:在 `foreach` 循环中逐条调用 `$this->ahead_user_reward_model->get_reward_name()`,数据量大时将引发严重数据库压力。 | 循环外批量提取 `reward_id`,一次性查询后构建映射数组,在循环中直接读取。 | `$reward_ids = array_filter(array_column($data, 'reward_id'));<br>$reward_map = $this->ahead_user_reward_model->get_names_map($reward_ids);<br>// 循环内: $v['reward_name'] = $reward_map[$v['reward_id']] ?? '';` |
| 🟠 警告 | 文件顶部 & `refund()` | **框架生命周期滥用**:`$CI = &get_instance();` 在类外部定义,且通过 `$CI->add_book_order_operation_log` 控制防重逻辑。违反 CI 依赖注入规范,且全局状态易引发并发冲突。 | 移除文件顶部代码。防重逻辑应依赖数据库唯一索引或分布式锁,而非内存变量。 | `// 删除顶部 $CI = &get_instance();<br>// 防重改为: 在退款前检查流水表是否存在 status=4 的记录,或使用 Redis SETNX` |
| 🟠 警告 | `refund()` 方法 | **事务回滚逻辑脆弱**:手动调用 `$this->db->trans_rollback()` 后直接 `throwError()`,若 `throwError` 未抛出标准异常或中断执行,可能导致 `trans_complete()` 无法正确提交/回滚,引发事务悬挂。 | 使用 `try...catch` 包裹核心逻辑,在 `catch` 中统一回滚并抛出标准异常。 | `try {<br> $this->db->trans_start();<br> // 业务逻辑...<br> $this->db->trans_complete();<br>} catch (\Throwable $e) {<br> $this->db->trans_rollback();<br> throw new \RuntimeException($e->getMessage(), 0, $e);<br>}` |
| 🟡 建议 | 全局 | **魔法数字/字符串泛滥**:状态码 `'4'`、`'1'`、类型 `'3'`、支付平台 `8,9,13` 等硬编码散落各处,可读性差且易引发维护错误。 | 提取为类常量或枚举(PHP 8.1+),统一使用整型比较。 | `const STATUS_PAID = 1; const STATUS_REFUNDED = 4; const TYPE_BOOKING = 3;<br>if ($pay_log['_status'] === self::STATUS_REFUNDED)` |
| 🟡 建议 | `get_list()` 方法 | **查询构建方式混用**:数组条件 `$where['like'][]` 与原生 SQL 字符串 `$where['where'] = ['(log._title like...']` 混用,破坏框架抽象层,增加调试难度。 | 统一使用 Query Builder 链式调用或纯数组语法,避免混用。 | `$this->db->group_start()<br>->like('log._title', $title)<br>->or_like('book._group_package_name', $title)<br>->or_like('book._group_platform_name', $title)<br>->group_end();` |
| 🟡 建议 | 全局 | **不符合 PSR-12 规范**:类名使用蛇形命名、方法缩进不一致、缺少 PHP 7+ 类型声明、DocBlock 不完整。 | 遵循 PSR-12,使用驼峰命名,添加属性/参数类型提示,完善 `@throws` 说明。 | `class AheadSongsSalesPayLogModel extends SimpleModel<br>{<br> public function get_list(array $params, bool $export = false): array` |
---
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **彻底消除 SQL 拼接**:立即将 `refund()` 与 `get_list()` 中所有手动拼接的 SQL 替换为框架 Query Builder 或参数绑定。这是当前最高危的安全漏洞。
2. **重构事务与异常处理**:引入 `try-catch` 统一接管 `$this->db->trans_start()` 与 `trans_complete()`,确保任何异常都能安全回滚,避免数据不一致。
3. **替换弱加密方案**:废弃 `md5` + 硬编码盐值,改用 `hash_hmac('sha256', $data, $secret)` 或框架内置加密库。
### 🛠 后续重构方向
1. **性能优化**:
- 解决 `get_list()` 中的 N+1 查询问题,采用批量查询+内存映射。
- 将 `load->model()` 调用收敛至 `__construct()` 或使用依赖注入容器,避免运行时重复加载。
2. **架构与规范升级**:
- 提取业务常量(状态、类型、支付渠道)为 `const` 或 `enum`。
- 将复杂的退款逻辑拆分为独立的 `RefundService`,遵循单一职责原则(SRP),Model 仅负责数据存取。
- 全面对齐 PSR-12,启用 PHP 8+ 类型声明(如 `array`, `int`, `string`, `bool`),提升静态分析能力。
3. **框架适配确认**:
- 若 `phpci` 为 CI4,建议全面迁移至 `Model` 基类与 `Entity` 模式,弃用 `$this->db->trans_*` 手动事务,改用 `$this->db->transStart()` 与 `transComplete()` 自动回滚机制。
- 查阅 `phpci` 官方文档确认 `Simple_model` 的底层实现,若其不支持自动转义,需强制封装安全查询方法。
> 💡 **提示**:当前代码片段未包含 `Simple_model` 基类及 `throwError`、`do_log` 等辅助函数的实现。若这些函数内部已做安全过滤或事务接管,部分风险等级可适当下调。建议补充基类代码以便进行更精准的架构级审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779262313
|
1779262313
|
0
|
0
|
0
|
0
|
Edit
Delete
|