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 559 from issue
id
559
repo_id
21
index
245
poster_id
1
original_author
original_author_id
0
name
🔍 代码审查报告:pay-260616 - 1
content
## 自动代码审查报告 **分支**: pay-260616 **提交**: `05e7689ae
## 自动代码审查报告 **分支**: pay-260616 **提交**: `05e7689ae7449d2e8212535ae8622b8e19fa842d` **提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com) **时间**: 2026-06-05 14:10:31 --- ## 1. 审查摘要 - **代码质量评分**:5.5 / 10 分 - **总体评价**:该 Model 承载了核心套餐查询、价格计算、VIP折扣及微信预订等业务逻辑,功能覆盖较全。但代码存在**严重的 SQL 注入隐患**与**数组遍历逻辑缺陷**,且大量业务规则硬编码、魔法数字散落、原生 SQL 与查询构造器混用,导致可维护性与性能存在明显瓶颈。整体处于“能跑但高危”状态,需优先修复安全与逻辑漏洞。 - **风险等级**:🔴 高 > 📌 **框架说明**:从目录结构(`system/helpers/`、`$CI = &get_instance()`)及编码习惯判断,该代码实际基于 **CodeIgniter 3** 框架。若确为内部 `phpci` 框架,请确认其底层 DB 驱动与生命周期是否与 CI3 一致。以下审查基于 CI3 规范与通用 PHP 最佳实践。 ## 2. 问题详情 | 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) | | :--- | :--- | :--- | :--- | :--- | | 🔴 严重 | `get_package_price_list` / `get_screen_list` (循环体内) | `foreach ($list as &$row) { if (...) { unset($row); continue; } }` 无法移除数组元素。`unset($row)` 仅销毁引用变量,原数组数据仍会返回,导致无效套餐暴露。 | 改用键值遍历或 `array_filter` 安全移除元素。 | `foreach ($list as $key => &$row) { if ($book_arrival_time < $order_end_time) { unset($list[$key]); continue; } }` | | 🔴 严重 | `get_book_package_list` / `get_hot_sale_top5` (多处 SQL 拼接) | 原生 SQL 直接拼接 `$shop_name`、`$param['special_merchant_id']` 等外部参数,未使用参数绑定或转义,存在**高危 SQL 注入漏洞**。 | 全面替换为 CI3 查询构造器,或使用 `$this->db->query($sql, $binds)` 绑定参数。 | `$this->db->query("... WHERE shop._name LIKE ?", ['%' . $this->db->escape_like_str($shop_name) . '%']);` | | 🟠 警告 | 全局多处 (折扣计算) | 折扣率连续除以 10 (`$goods_discount_rate / 10 / 10`),业务意图不清晰且易引发浮点数精度丢失(如 `95 -> 9.5 -> 0.9500000000000001`)。 | 明确折扣基数转换逻辑,统一使用 `/100` 并配合 `round()` 或 `bcmath` 保证精度。 | `$discount_decimal = round($goods_discount_rate / 100, 4); $row['actual_price'] = $row['vip_price'] * $discount_decimal;` | | 🟠 警告 | `get_book_package_list` (距离排序) | 使用 `ORDER BY FIELD()` 配合静态变量 `$_shop_id_arr` 缓存门店 ID 进行距离排序。`FIELD()` 无法利用索引,数据量大时全表扫描;静态变量仅请求级有效,缓存策略不透明且易引发并发脏读。 | 改用 MySQL 空间函数计算距离排序,或交由 Redis GEO / 应用层处理;移除不必要的静态缓存。 | `ORDER BY (6371 * ACOS(COS(RADIANS(?)) * COS(RADIANS(latitude)) * COS(RADIANS(longitude) - RADIANS(?)) + SIN(RADIANS(?)) * SIN(RADIANS(latitude)))) ASC` | | 🟠 警告 | `get_package_price_list` / `check_use_package` | 时间/星期周期判断逻辑高度耦合,大量使用字符串插值构造 `WHERE` 条件(如 `FIND_IN_SET('{$businessDay}',_disabled_date) = ''`),且存在注释掉的废弃逻辑,可读性与可测试性差。 | 将时间窗口校验抽离为独立私有方法,使用 CI3 链式查询构造器,清理 `//todo` 与注释代码。 | `$this->db->where("FIND_IN_SET(?, _disabled_date) = ''", $businessDay);` | | 🟡 建议 | 文件头部 (第 4-6 行) | `$CI = &get_instance();` 在类定义外部直接执行。文件被 `include/require` 时若框架未完全初始化,将触发 Fatal Error。 | 移至类构造函数或具体方法内部,遵循框架生命周期。 | `public function __construct() { parent::__construct(); $this->load->model('Simple_model'); }` | | 🟡 建议 | 全局 | 大量魔法数字(`4`, `2`, `100`, `86400`, `3`)散落,且类名/方法名使用 `snake_case`,不符合 PSR-12 规范,影响现代化工具链(如静态分析、IDE 提示)集成。 | 提取为类常量;若团队允许,逐步重构为 `PascalCase` 类名与 `camelCase` 方法名。 | `const SECONDS_PER_DAY = 86400; const TYPE_RENEW = 4;` | | 🟡 建议 | `get_package_by_fields` | 多次在方法内部 `$this->load->model()`。CI3 虽会缓存已加载模型,但频繁调用仍增加 I/O 开销且破坏单一职责。 | 统一在 `__construct()` 中加载,或使用依赖注入容器管理。 | `public function __construct() { parent::__construct(); $this->load->model(['ahead_vip_level_model', 'ahead_merchant_goods_model']); }` | ## 3. 总结与行动建议 ### 🔑 优先修复项(P0) 1. **修复 SQL 注入**:立即将 `get_book_package_list`、`get_hot_sale_top5` 中的原生 SQL 替换为查询构造器或参数绑定。这是当前最高危的安全漏洞。 2. **修复 `unset` 逻辑缺陷**:全局搜索 `foreach` 中的 `unset($row)`,改为 `unset($list[$key])` 或使用 `array_filter`,防止脏数据返回前端。 3. **清理外部实例化**:移除文件顶部的 `$CI = &get_instance();`,确保模型加载符合框架生命周期。 ### 🛠 后续重构与优化方向 1. **查询性能优化**: - 避免在循环中执行数据库查询。当前 `get_package_by_fields` 已尝试批量拉取商品,但关联逻辑仍显臃肿。建议将套餐、价格、商品关联查询合并为单次 `JOIN` 或使用 `IN()` 批量查询。 - 距离排序建议引入 MySQL 5.7+ 的 `ST_Distance_Sphere` 或 Redis GEO,彻底废弃 `FIELD()` 排序。 2. **业务逻辑解耦**: - 将“VIP折扣计算”、“时间窗口校验”、“社区模式过滤”抽离为独立的 `Service` 或 `Trait`,避免 Model 承担过多业务规则。 - 统一浮点数处理规范,涉及金额计算建议全程使用 `int`(分)或 `bcmath`,避免精度漂移。 3. **代码规范与可维护性**: - 清理所有 `//edit by nan`、`//todo` 及注释掉的代码块,交由 Git 版本控制管理。 - 逐步对齐 PSR-12 规范,配合 `PHP_CodeSniffer` 或 `PHP-CS-Fixer` 建立 CI 流水线卡点。 > ⚠️ **局限性说明**:提供的代码在 `get_book_package_list_group_by_shop` 方法处截断(`$special_city_id = [2, 3, 4, 5, 34,`),无法评估该方法的完整逻辑、分页实现及异常处理。建议补充完整代码以便进行闭环审查。 --- *此 Issue 由代码审查服务自动创建*
...
milestone_id
0
priority
0
is_closed
0
is_pull
0
num_comments
0
ref
deadline_unix
0
created_unix
1780639831
updated_unix
1780639831
closed_unix
0
is_locked
0
content_version
0
time_estimate
0
Delete
Cancel