| content |
## 自动代码审查报告
**分支**: app-260616
**提交**: `2babef389 ## 自动代码审查报告
**分支**: app-260616
**提交**: `2babef3899284f6a8961257ab999996cebce6e4b`
**提交人**: chenjunfeng (developer.jeff.c@gmail.com)
**时间**: 2026-05-28 13:34:20
---
## 1. 审查摘要
- **代码质量评分**:4.5 / 10 分
- **总体评价**:该模型承载了大量核心业务逻辑(房态管理、计费、VIP折扣、转房等),但实现方式偏向“脚本化”,存在严重的 SQL 注入风险、全局变量滥用、方法职责过重(God Method)及返回值不一致等问题。代码风格与 PSR-12 规范存在较大差距,且部分逻辑未充分利用框架提供的查询构建器与生命周期机制。
- **风险等级**:🔴 高
- **⚠️ 局限性说明**:您提供的代码在末尾处被截断(`$priv_where['_role_i`),本次审查基于已提供的完整方法进行分析。若截断部分包含关键鉴权或事务逻辑,请补充后二次审查。
- **📌 框架说明**:根据目录结构、`get_instance()`、`$this->load->` 及 `$this->db->` 等特征,判定该代码基于 **CodeIgniter 3** 架构。若 `phpci` 为内部定制分支,请结合其官方文档核对生命周期与组件加载差异。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `list_rooms_info`<br>`list_nearby_family_servers_info`<br>`get_nearby_ids`<br>`get_family_server_ids_by_shop_ids` | **SQL 注入漏洞**:多处直接将外部传入的 `$addsql`、`$shop_ids` 拼接至 SQL 语句中,未进行任何转义或参数绑定,攻击者可构造恶意输入执行任意 SQL。 | 1. 优先使用 CI3 Query Builder 构建查询。<br>2. 若必须拼接,使用 `$this->db->escape_str()` 或严格白名单校验。<br>3. `IN` 查询使用 `$this->db->where_in()`。 | ```php<br>// 原危险写法<br>$sql = "... WHERE _shop_id in " . $shop_ids;<br><br>// 安全写法<br>$ids = array_filter(explode(',', $shop_ids), 'is_numeric');<br>$this->db->where_in('_shop_id', $ids)<br> ->order_by('_id', 'DESC')<br> ->get('ahead_family_servers')<br> ->result_array();<br>``` |
| 🔴 严重 | 文件顶部 (第 9-10 行) | **全局 `$CI` 实例滥用**:在类外部执行 `$CI =& get_instance();` 会在文件被 `require` 时立即触发,破坏框架路由与生命周期,易导致内存泄漏或上下文污染。 | 删除类外部的 `$CI` 声明。CI 框架会自动处理模型继承与加载。如需在方法内使用,应在方法内部按需 `$this->load->helper()`。 | ```php<br>// ❌ 删除文件顶部的这两行<br>$CI =& get_instance();<br>$CI->load->model('Simple_model');<br><br>// ✅ 在构造函数或具体方法中按需加载<br>public function __construct() {<br> parent::__construct();<br> $this->load->helper('common');<br>}<br>``` |
| 🟠 警告 | `get_count_status_room`<br>`get_count_room_by_shop` | **Token 解析未做边界校验**:`list($merchant_id, $uid, $utype, $sign) = explode("_", $token);` 若 token 格式不符(如缺少 `_` 或数量不对),将直接触发 `Warning` 并导致变量未定义,后续逻辑崩溃。 | 解析前校验数组长度,或使用 `sscanf`/正则匹配。建议将 Token 解析逻辑抽离至统一的鉴权中间件/Helper。 | ```php<br>$parts = explode('_', $token);<br>if (count($parts) !== 4) {<br> return ['status' => -1, 'msg' => 'Token格式非法'];<br>}<br>[$merchant_id, $uid, $utype, $sign] = $parts;<br>``` |
| 🟠 警告 | `update_status` vs `update_room_status` | **逻辑重复与状态机不一致**:两个方法功能高度重叠,但一个校验前置状态,一个不校验;且 Redis 更新逻辑分散。易导致并发场景下房态不一致。 | 合并为单一入口方法,通过参数 `$check_prev_status = true/false` 控制校验逻辑。将 Redis 状态同步封装为独立私有方法 `syncRoomStatusToRedis()`。 | ```php<br>public function updateRoomStatus($family_server_id, $status, $pre_status = null, $msg = '', $add_up = []) {<br> if ($pre_status !== null && $pre_status != $this->getCurrentStatus($family_server_id)) {<br> return ['status' => -2, 'msg' => '状态已变更'];<br> }<br> // 统一执行 DB 更新 -> 日志记录 -> Redis 同步<br>}<br>``` |
| 🟠 警告 | `get_change_new_room_info`<br>`get_room_detail` | **方法职责过重(God Method)**:单方法超 150 行,混合了订单查询、VIP折扣计算、低消逻辑、权限校验、按钮权限拼接等。违反单一职责原则,极难测试与维护。 | 引入 **Service 层**(如 `RoomChangeService`, `BillingCalculator`)。Model 仅负责数据存取,业务规则与计算逻辑下沉至 Service。 | 建议重构结构:<br>`Model` -> 数据查询<br>`Service` -> 业务编排、价格计算、状态流转<br>`Controller` -> 参数校验、调用 Service、返回响应 |
| 🟡 建议 | 全局多处 | **返回值类型不一致**:部分返回 `['status' => -1, 'msg' => '...']`,部分返回 `['status' => false]`,部分直接返回 `true`/`array()`。上游调用方需编写大量兼容逻辑。 | 统一响应结构,建议遵循:`['code' => int, 'msg' => string, 'data' => mixed]`。成功统一返回 `code: 0` 或 `code: 1`。 | ```php<br>// 统一规范<br>return ['code' => 0, 'msg' => 'success', 'data' => $result];<br>return ['code' => 1001, 'msg' => '包厢不存在', 'data' => null];<br>``` |
| 🟡 建议 | `self::$room_status`<br>`$function_list` 数组 | **魔法数字与硬编码**:大量使用 `-1, 0, 1, 2, 3` 表示状态,`$function_list` 映射关系冗长且无注释。可读性差,后期扩展易出错。 | 使用 `const` 或 `Enum`(PHP 8.1+)定义状态常量。将功能映射表移至配置文件或独立策略类。 | ```php<br>class RoomStatus {<br> const UNCONNECTED = -1;<br> const FREE = 0;<br> const CONSUMING = 1;<br> const REPAIRING = 2;<br> const CLEANING = 3;<br>}<br>// 使用时:if ($status === RoomStatus::REPAIRING) { ... }<br>``` |
| 🟡 建议 | 全局 | **PSR-12 规范与代码整洁度**:混用 `array()` 与 `[]`;变量命名不规范(`$addsql`, `$_id`);存在大量注释掉的代码块;包含非专业注释(如 `//无敌了简直`)。 | 1. 统一使用短数组语法 `[]`。<br>2. 遵循 `snake_case` 命名,移除前缀 `_`(除非框架强制)。<br>3. 清理废弃代码,使用 Git 管理历史。<br>4. 移除情绪化/非技术注释。 | 使用 `PHP_CodeSniffer` 或 `PHP-CS-Fixer` 配置 PSR-12 规则进行自动化格式化。 |
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **彻底修复 SQL 注入**:立即替换所有字符串拼接 SQL,全面启用 `$this->db->query_builder()` 或 `$this->db->query($sql, $bindings)`。这是当前最高危的安全漏洞。
2. **移除类外 `$CI =& get_instance();`**:避免框架初始化阶段产生不可预知的副作用。
3. **Token 解析防御**:增加格式校验,防止 `explode` 导致数组越界或变量未定义错误。
### 🛠 后续重构方向
1. **架构分层(Model-Service-Controller)**:
- `Model` 仅保留 CRUD、基础查询与数据映射。
- 将 `get_change_new_room_info`、`get_room_detail` 中的计费、折扣、权限按钮生成逻辑抽离至 `RoomBusinessService`。
- 降低模型耦合度,提升单元测试覆盖率。
2. **统一状态机与响应规范**:
- 定义全局状态常量类,消除魔法数字。
- 制定统一的 API 返回结构,配合全局异常处理器(`show_error` / `show_404` 或自定义 `ApiResponse` 类)。
3. **性能与缓存优化**:
- `get_count_status_room` 等高频统计接口建议引入 Redis 缓存或物化视图,避免每次请求执行 `COUNT` + `GROUP BY`。
- 批量加载模型:在构造函数或初始化方法中统一 `load` 常用模型,避免在循环或条件分支中重复 `$this->load->model()`。
4. **代码规范治理**:
- 接入 CI/CD 静态扫描(PHPStan / Psalm + PHP-CS-Fixer),强制 PSR-12 规范。
- 清理所有注释代码,使用 Git 提交历史替代。
> 💡 **专家提示**:该文件已演变为典型的“大泥球(Big Ball of Mud)”架构。建议在下一个迭代周期中,**以业务域为边界进行垂直拆分**(如 `RoomStatusModel`, `BillingModel`, `PermissionModel`),并配合 Service 层进行逻辑收敛。若需针对截断部分的权限校验逻辑(`$priv_where['_role_i...`)进行专项安全审查,请提供完整代码片段。
---
*此 Issue 由代码审查服务自动创建*... |