sqlite-web 0.7.2
gitea.db
issue
Create
Query
access
access_token
action
action_artifact
action_run
action_run_index
action_run_job
action_runner
action_runner_token
action_schedule
action_schedule_spec
action_task
action_task_output
action_task_step
action_tasks_version
action_variable
app_state
attachment
auth_token
badge
branch
collaboration
comment
commit_status
commit_status_index
commit_status_summary
commit_sync_log
commit_sync_status
dbfs_data
dbfs_meta
deploy_key
email_address
email_hash
external_login_user
follow
gpg_key
gpg_key_import
hook_task
issue
issue_assignees
issue_content_history
issue_dependency
issue_index
issue_label
issue_pin
issue_user
issue_watch
label
language_stat
lfs_lock
lfs_meta_object
login_source
milestone
mirror
notice
notification
oauth2_application
oauth2_authorization_code
oauth2_grant
org_user
package
package_blob
package_blob_upload
package_cleanup_rule
package_file
package_property
package_version
project
project_board
project_issue
protected_branch
protected_tag
public_key
pull_auto_merge
pull_request
push_mirror
reaction
release
renamed_branch
repo_archiver
repo_hidden_file
repo_indexer_status
repo_license
repo_redirect
repo_topic
repo_transfer
repo_unit
repository
review
review_state
secret
session
sqlite_sequence
star
stopwatch
system_setting
task
team
team_invite
team_repo
team_unit
team_user
topic
tracked_time
two_factor
upload
user
user_badge
user_blocking
user_open_id
user_redirect
user_setting
version
watch
webauthn_credential
webhook
Toggle helper tables
Structure
Content
Query
Insert
Drop
Import
Export
Delete row 229 from issue
id
229
repo_id
21
index
39
poster_id
1
original_author
original_author_id
0
name
🔍 代码审查报告:pay-260519 - 多支付金额精度问题
content
## 自动代码审查报告 **分支**: pay-260519 **提交**: `a48824ffc
## 自动代码审查报告 **分支**: pay-260519 **提交**: `a48824ffcf969dce4831db7dc2b01f791afe913c` **提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com) **时间**: 2026-05-20 10:03:22 --- ## 1. 审查摘要 - **代码质量评分**:6.5 / 10 分 - **总体评价**:代码实现了完整的预订、支付回调、退款及时间计算核心业务,逻辑链路较为完整。但存在明显的架构反模式:模型层承担了过多业务逻辑(违反单一职责原则),事务处理与异常捕获机制存在冲突,部分查询存在 SQL 注入风险与 N+1 性能瓶颈。静态缓存使用不当,且代码未遵循现代 PHP 编码规范。 - **风险等级**:🔴 高(存在 SQL 注入隐患、事务状态不一致风险、并发超卖可能) - **⚠️ 局限性说明**:提供的代码片段在末尾被截断,部分方法(如 `create_community_shop_book_order`、`_get_un_book_time`)未完整展示。本次审查基于已提供内容,未展示部分可能存在同类问题。 ## 2. 问题详情 | 严重程度 | 文件/方法 | 问题描述 | 建议修改方案 | 代码示例 (可选) | | :--- | :--- | :--- | :--- | :--- | | 🔴 严重 | `Ahead_book_order_model.php`<br>`refund_by_notify()` | **SQL 注入风险**:`$log_where` 使用字符串拼接构造 SQL 条件,若 `_id` 未严格过滤或传入恶意字符,将导致注入。 | 废弃字符串拼接,统一使用框架查询构造器或参数绑定机制。 | `$this->db->where('_relation_id', $order_data['_id'])`<br>`->where('_status', 1)`<br>`->where_in('_type', [5, 13])` | | 🔴 严重 | `Ahead_book_order_model.php`<br>`check_notify()` | **事务与异常处理冲突**:`try` 块内手动调用 `$this->db->trans_rollback()` 后直接 `return`,后续若执行 `$this->db->trans_complete()` 会引发框架报错或事务状态残留。 | 统一使用显式事务控制:`trans_begin()` / `trans_commit()` / `trans_rollback()`,或完全依赖 `trans_start()`/`trans_complete()` 的自动回滚机制,二者不可混用。 | ```php<br>$this->db->trans_begin();<br>try {<br> // 业务逻辑<br> if ($error) throw new Exception($msg);<br> $this->db->trans_commit();<br>} catch (Exception $e) {<br> $this->db->trans_rollback();<br> throw $e;<br>}``` | | 🔴 严重 | `Ahead_book_order_model.php`<br>`check_notify()` | **支付回调缺乏幂等性与并发锁**:仅通过状态判断处理回调,高并发下可能被重复触发,导致重复扣减库存、重复发送通知或重复记录流水。 | 增加数据库唯一约束(如 `UNIQUE(order_id, trade_no)`),或使用 Redis 分布式锁/数据库行锁(`SELECT ... FOR UPDATE`)保证原子性。 | 在事务开头执行:<br>`$this->db->where('_id', $order_id)->where('_status', -1)->get()->row()`<br>若为空则直接返回成功(已处理) | | 🟠 警告 | `Ahead_book_order_model.php`<br>`get_list()` | **N+1 查询性能瓶颈**:`foreach` 循环内逐条调用 `$this->ahead_merchant_model->get_one()`,订单量大时数据库压力呈指数级增长。 | 提前收集所有 `merchant_id`,使用 `where_in` 批量查询,构建映射数组后在循环中赋值。 | ```php<br>$ids = array_column($order_info, 'merchant_id');<br>$merchants = $this->ahead_merchant_model->get_where_in('_id', $ids, '_business_model');<br>$map = array_column($merchants, '_business_model', '_id');<br>foreach ($order_info as &$v) { $v['business_model'] = $map[$v['merchant_id']] ?? '1'; }``` | | 🟠 警告 | `Ahead_shop_book_time_info_model.php`<br>全局 | **静态变量缓存导致内存泄漏/数据陈旧**:`self::$book_days_info`、`self::$shop_data` 等静态属性在 PHP-FPM 长生命周期中不会自动释放,易导致内存溢出或读取过期配置。 | 改用框架缓存组件(如 Redis/Memcached)或请求级单例模式,并在请求结束时清理。避免在 Model 中使用 `static` 缓存业务数据。 | ```php<br>// 推荐:使用 CI Cache<br$cache_key = "shop_{$merchant_id}_{$shop_id}_days";<br>$data = $this->cache->get($cache_key);<br>if (!$data) { $data = $this->calc_days(); $this->cache->save($cache_key, $data, 300); }``` | | 🟠 警告 | `Ahead_book_order_model.php`<br>`check_notify()` | **敏感信息日志泄露**:`json_encode($e->getTrace(), 256)` 记录完整异常堆栈,可能包含数据库凭证、API 密钥或用户隐私。 | 仅记录 `$e->getMessage()`、`$e->getCode()` 及脱敏后的上下文,生产环境关闭详细堆栈输出。 | `doLog("支付失败: {$e->getMessage()} | Code: {$e->getCode()}", 'book_order');` | | 🟡 建议 | 全局 | **违反 PSR-12 与单一职责原则**:模型方法过长(如 `check_notify`、`refund_by_notify` 超 300 行),混合了数据校验、库存扣减、支付网关调用、短信/微信推送、财务流水等逻辑。 | 引入 Service 层拆分职责:Model 仅负责数据持久化;支付/退款逻辑封装至 `PaymentService`;通知逻辑使用事件/观察者模式。 | 创建 `BookOrderService::handlePayNotify($data)` 统一编排流程,Model 退化为纯数据访问层。 | | 🟡 建议 | 文件顶部 | **全局 `$CI` 实例化位置不当**:`$CI = &get_instance();` 写在类外部,违反 CI 框架加载规范,可能导致未初始化时调用报错。 | 移除文件顶部声明。在方法内部按需 `$CI =& get_instance();`,或直接使用 `$this->load->model()` / `$this->config->load()`。 | 删除顶部两行,改用 `$this->load->model('Simple_model');` 或在 `__construct()` 中加载。 | | 🟡 建议 | 全局 | **魔法数字与硬编码泛滥**:大量状态码(`-1, 1, 2, 3, 4, 5`)、支付场景码(`5, 6, 7...`)、短信模板 ID(`56, 58`)直接硬编码。 | 提取为类常量或独立配置文件,提升可读性与可维护性。 | `const STATUS_PENDING = -1;`<br>`const PAY_SCENE_WECHAT = '5';`<br>`const SMS_TEMPLATE_BOOK = 56;` | ## 3. 总结与行动建议 ### 🔑 优先修复的关键问题 1. **修复 SQL 注入漏洞**:立即替换 `refund_by_notify()` 中的 `$log_where` 字符串拼接,改用查询构造器或参数绑定。 2. **规范事务控制**:统一采用 `trans_begin()` / `trans_commit()` / `trans_rollback()` 显式事务管理,移除 `try-catch` 内与 `trans_complete()` 的混用逻辑。 3. **增加支付回调幂等性**:在 `check_notify()` 入口处增加基于 `order_id` 的状态原子校验或分布式锁,防止重复处理导致的数据错乱。 ### 🛠 后续重构与优化方向 1. **架构分层(MVC -> MVCS)**:当前 Model 承载了过多业务逻辑。建议引入 `Service` 层处理复杂流程(如支付回调、退款路由、库存扣减),Model 仅保留 CRUD 操作。通知类操作(微信模板消息、短信)应通过事件总线(Event/Observer)异步解耦。 2. **性能优化**: - 消除 `get_list()` 等列表接口的 N+1 查询。 - 将 `Ahead_shop_book_time_info_model` 中庞大的时间计算逻辑拆分为独立的 `TimeSlotCalculator` 类,避免单次请求内存峰值过高。 - 移除静态变量缓存,替换为带 TTL 的 Redis 缓存。 3. **代码规范与可维护性**: - 严格遵循 PSR-12,统一使用短数组语法 `[]`,补充方法参数类型声明与返回值类型(如 `public function check_notify(string $order_id, string $transaction_id = ''): array`)。 - 建立全局状态常量类,替换所有魔法数字。 - 补充关键业务分支的单元测试,特别是退款路由(微信/通联/团购)与库存扣减逻辑。 > 📌 **框架适配提示**:代码结构高度符合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制框架,请重点核对 `$this->db->trans_*()` 系列方法的生命周期是否与 CI3 一致。若存在差异,请以 `phpci` 官方文档的事务与模型加载规范为准。 --- *此 Issue 由代码审查服务自动创建*
...
milestone_id
0
priority
0
is_closed
0
is_pull
0
num_comments
0
ref
deadline_unix
0
created_unix
1779242602
updated_unix
1779242602
closed_unix
0
is_locked
0
content_version
0
time_estimate
0
Delete
Cancel