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 271 from issue
id
271
repo_id
23
index
15
poster_id
1
original_author
original_author_id
0
name
🔍 代码审查报告:admin-260519 - 预订单退款,更新关联的预购单的营业额报表记录
content
## 自动代码审查报告 **分支**: admin-260519 **提交**: `28b093d
## 自动代码审查报告 **分支**: admin-260519 **提交**: `28b093dff5745af29908b52fea4c9c0c26b044aa` **提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com) **时间**: 2026-05-21 14:25:11 --- ## 1. 审查摘要 - **代码质量评分**:5.5 / 10 分 - **总体评价**:业务逻辑覆盖较完整,退款流程考虑了多支付渠道、会员账户及团购券撤销等复杂场景。但代码存在**严重的事务原子性缺失、SQL注入风险、硬编码安全密钥**等高危问题。同时存在 N+1 查询、重复模型加载、魔法数字泛滥等性能与规范缺陷,整体偏向过程式编程,未充分发挥框架特性与面向对象优势。 - **风险等级**:🔴 高 --- ## 2. 问题详情 | 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) | | :--- | :--- | :--- | :--- | :--- | | 🔴 严重 | `Ahead_book_order_change_pay_log_model.php`<br>`refund()` 方法 | **事务缺失导致数据不一致**:在 `foreach` 循环中逐条执行 `update()`,若中间某条失败直接 `return`,会导致已更新记录状态变为 `4`,未更新记录仍为 `1`,破坏业务原子性。 | 使用数据库事务包裹整个退款流程。收集所有需退款记录,统一处理或捕获异常后回滚。 | ```php<br>$this->db->trans_start();<br>try {<br> foreach ($log_data as $log) {<br> // 执行更新逻辑<br> }<br> $this->db->trans_complete();<br>} catch (\Exception $e) {<br> $this->db->trans_rollback();<br> return ['status'=>false, 'msg'=>$e->getMessage()];<br>}<br>``` | | 🔴 严重 | `Ahead_songs_sales_pay_log_model.php`<br>`get_list()` & `refund()` | **SQL 注入风险**:多处使用字符串拼接构造 SQL 条件(如 `$where['where']`, `$log_where`, `$update_sql`)。若外部参数未严格校验,将直接注入恶意 SQL。 | 全面改用 CI 查询构造器(Query Builder)或参数绑定。金额计算避免直接拼接,使用框架安全方法。 | ```php<br>// 替换前<br>$where['where'] = ['(log._title like "%' . $title . '%")'];<br>// 替换后<br>$this->db->group_start();<br>$this->db->like('log._title', $title);<br>$this->db->or_like('book._group_package_name', $title);<br>$this->db->group_end();<br>``` | | 🔴 严重 | 两文件 `wx_refund` 逻辑 | **硬编码加密盐值**:`md5(... . '1441600902')` 将固定密钥写死在代码中,违反安全规范,一旦泄露可伪造退款签名。 | 将盐值移至配置文件或环境变量,通过 `$this->config->item()` 读取。 | ```php<br>$salt = $this->config->item('wx_refund_sign_salt');<br>$refund_data['refund_key'] = md5($log_id . $trade_no . $salt);<br>``` | | 🟠 警告 | `Ahead_songs_sales_pay_log_model.php`<br>`get_list()` 循环内 | **N+1 查询性能瓶颈**:在 `foreach` 中循环调用 `$this->ahead_user_reward_model->get_reward_name()`,数据量大时将产生大量冗余数据库请求。 | 提前批量获取 `reward_id` 映射关系,在循环中通过数组键值赋值。 | ```php<br>$reward_ids = array_filter(array_column($data, 'reward_id'), fn($id)=>$id>0);<br>$reward_map = $this->ahead_user_reward_model->get_names_by_ids($reward_ids);<br>foreach ($data as &$v) {<br> $v['reward_name'] = $reward_map[$v['reward_id']] ?? '';<br>}<br>``` | | 🟠 警告 | 两文件多处 | **频繁动态加载模型**:在方法或循环内反复调用 `$this->load->model()`,增加 I/O 开销且不符合框架最佳实践。 | 将依赖模型统一移至类构造函数 `__construct()` 中加载,或配置自动加载。 | ```php<br>public function __construct() {<br> parent::__construct();<br> $this->load->model(['ahead_vip_model', 'ahead_vip_account_log_model']);<br>}<br>``` | | 🟠 警告 | `Ahead_songs_sales_pay_log_model.php`<br>`refund()` 方法 | **事务回滚机制冗余**:手动调用 `$this->db->trans_rollback()` 后接 `throwError()`,与 CI 的 `trans_start()/trans_complete()` 自动回滚机制冲突,易导致事务状态混乱或死锁。 | 移除手动 `trans_rollback()`,依赖 CI 自动事务管理。仅在 `trans_complete()` 后检查状态并抛出标准异常。 | ```php<br>$this->db->trans_start();<br>// 执行所有 DB 操作<br>$this->db->trans_complete();<br>if ($this->db->trans_status() === FALSE) {<br> throw new \Exception('退款事务执行失败');<br>}<br>``` | | 🟡 建议 | 全局 | **拼写错误与魔法数字**:如 `$vip_account_refund_blance`(应为 balance),状态码 `1,3,4,5,8` 等硬编码散落,降低可读性与可维护性。 | 修正拼写,定义类常量或配置文件集中管理业务状态码与类型。 | ```php<br>const STATUS_PAID = 1;<br>const STATUS_REFUNDED = 4;<br>const PAY_PLATFORM_WECHAT = 1;<br>``` | | 🟡 建议 | `Ahead_book_order_change_pay_log_model.php` 顶部 | **反模式:文件顶部获取 CI 实例**:`$CI = &get_instance();` 在文件顶层执行,可能导致全局状态污染或加载时机错误。 | 删除顶部代码,模型继承应通过基类完成,依赖注入或构造函数加载。 | 移除顶部两行,保持纯类定义结构。 | --- ## 3. 总结与行动建议 ### 🔑 优先修复的关键问题 1. **保障退款事务原子性**:`Ahead_book_order_change_pay_log_model::refund()` 必须包裹在数据库事务中,防止部分退款成功导致账目不平。 2. **消除 SQL 注入隐患**:全面清理 `$where['where']`、`$log_where`、`$update_sql` 等字符串拼接逻辑,统一替换为 CI Query Builder 或参数化查询。 3. **移除硬编码密钥**:将 `1441600902` 迁移至 `application/config/config.php`,并通过配置项读取。 ### 🛠 后续重构与优化方向 1. **架构分层与 DRY 原则**: - 两个文件中的微信退款逻辑高度重复,建议抽离至独立的服务类(如 `application/services/WxRefundService.php`),通过依赖注入调用。 - 替换全局 `throwError()` 为 PHP 标准异常 `\Exception` 或 CI 内置错误处理,便于统一捕获与日志记录。 2. **性能调优**: - 解决 `get_list()` 中的 N+1 查询,采用批量预加载策略。 - 将 `$this->load->model()` 收敛至构造函数,减少运行时开销。 - 对高频查询字段(如 `_order_id`, `_status`, `_create_time`)确认数据库索引覆盖情况。 3. **规范与可维护性**: - 严格遵循 PSR-12 编码规范,补充 PHP 7+ 类型声明(如 `public function refund(array $book_order): array`)。 - 使用常量/枚举替代魔法数字,提升代码自解释能力。 - 若 `phpci` 为内部定制框架,请核对 `Simple_model` 的底层实现是否兼容标准 CI3 事务机制,必要时查阅官方文档确认 `up()`、`set_table_name()` 等自定义方法的安全边界。 > 💡 **注**:本次审查基于代码片段推断,部分自定义方法(如 `Simple_model::up()`, `throwError()`)的具体实现未提供。若其内部已做安全过滤或事务封装,请结合实际基类代码微调上述建议。建议在合并前补充单元测试覆盖核心退款分支。 --- *此 Issue 由代码审查服务自动创建*
...
milestone_id
0
priority
0
is_closed
0
is_pull
0
num_comments
0
ref
deadline_unix
0
created_unix
1779344711
updated_unix
1779344711
closed_unix
0
is_locked
0
content_version
0
time_estimate
0
Delete
Cancel