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 563 from issue
id
563
repo_id
21
index
249
poster_id
1
original_author
original_author_id
0
name
🔍 代码审查报告:pay-260616 - 1
content
## 自动代码审查报告 **分支**: pay-260616 **提交**: `8e1dccb85
## 自动代码审查报告 **分支**: pay-260616 **提交**: `8e1dccb858817ce5df42e311d5c00cefec60d15b` **提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com) **时间**: 2026-06-05 14:23:09 --- ## 1. 审查摘要 - **代码质量评分**:5.5 / 10 分 - **总体评价**:该 Model 承载了复杂的套餐查询、价格计算、社区模式校验及微信预订等业务逻辑,功能覆盖较全。但代码存在**严重的 SQL 注入漏洞**、**框架生命周期误用**、**大量重复逻辑**及**数组操作陷阱**。整体架构偏向“过程式堆砌”,未充分利用现代 PHP 与框架的 ORM/Query Builder 特性,可维护性与安全性亟待提升。 - **风险等级**:🔴 高(存在可直接利用的 SQL 注入与逻辑缺陷) > ⚠️ **局限性说明**:提供的代码在末尾 `$special_city_id = [2, 3, 4, 5, 34,` 处被截断,后续逻辑(如排序缓存、分页处理等)未完整展示。本次审查仅基于已提供部分,建议补充完整文件后复核。 --- ## 2. 问题详情 | 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) | | :--- | :--- | :--- | :--- | :--- | | 🔴 严重 | `get_book_package_list` / `get_hot_sale_top5` | **SQL 注入漏洞**:直接使用字符串拼接将 `$shop_name`、`$param['special_merchant_id']`、`$city_id` 等外部参数拼入原生 SQL,未做任何转义或绑定。 | 全面替换为框架 Query Builder 或使用 `$this->db->query($sql, $bindings)` 绑定参数。禁止直接拼接用户输入。 | `$this->db->query("... WHERE shop._name LIKE ? AND shop._merchant_id = ?", [$shop_name.'%', (int)$param['special_merchant_id']])` | | 🔴 严重 | 文件顶部 (第 4-5 行) | **框架生命周期误用**:在类外部直接调用 `$CI = &get_instance();` 并加载模型。此时框架尚未完成初始化,极易导致 `Fatal Error` 或返回空实例。 | 移除顶部全局代码。在类内部方法中按需使用 `$this->load->model()`,或统一在 `__construct()` 中加载。 | `// 删除顶部:<br>$CI = &get_instance();<br>$CI->load->model('Simple_model');` | | 🟠 警告 | `get_package_price_list` (约第 115 行) | **`unset($row)` 无法移除数组元素**:在 `foreach ($list as &$row)` 中执行 `unset($row)` 仅断开引用,原数组 `$list` 仍保留该元素,导致脏数据返回。 | 改用键值遍历或 `array_filter` 安全过滤。 | `foreach ($list as $key => &$row) {<br> if ($book_arrival_time < $order_end_time) {<br> unset($list[$key]);<br> continue;<br> }<br>}` | | 🟠 警告 | 多处方法 | **N+1 查询与重复加载模型**:在循环或高频调用方法中反复执行 `$this->load->model()`,且混合使用原生 SQL 与 Query Builder,增加数据库连接开销与内存占用。 | 将模型加载收敛至 `__construct()` 或使用框架的自动加载机制;统一使用 Query Builder 替代原生 SQL。 | `public function __construct() {<br> parent::__construct();<br> $this->load->model(['Ahead_vip_model', 'Ahead_yc_merchant_model']);<br>}` | | 🟠 警告 | `get_package_price_list` / `get_screen_list` | **魔法数字与硬编码泛滥**:`4`、`2`、`86400`、`10`、`100` 等散落于业务逻辑中,可读性差且易引发计算错误(如折扣率 `/10` 逻辑)。 | 提取为类常量,明确业务语义。 | `const PACKAGE_TYPE_GROUP = 4;<br>const SCREEN_RENEW_TYPE = 4;<br>const SECONDS_PER_DAY = 86400;<br>const DISCOUNT_BASE = 100;` | | 🟡 建议 | `get_package_price_list` & `get_screen_list` | **逻辑高度重复(DRY 原则违反)**:社区模式时间校验、营业日计算、套餐过滤逻辑在两个方法中几乎完全一致(超 80% 重复)。 | 抽取为私有方法 `filter_community_packages(array $list, array $baseParams)` 统一调用。 | `private function filter_community_packages($list, $params) {<br> // 提取公共校验逻辑<br> return $filtered_list;<br>}` | | 🟡 建议 | 全局 | **不符合 PSR-12 规范**:类名 `Ahead_room_package_infos_model` 未使用大驼峰;方法参数缺乏类型声明;注释未遵循 PHPDoc 标准。 | 重命名类为 `AheadRoomPackageInfosModel`;补充 `@param`/`@return` 类型;统一使用 4 空格缩进。 | `class AheadRoomPackageInfosModel extends Simple_model {<br> /** @return array */<br> public function getPackagePriceList(array $baseParams, array $params, int $uid = 0): array { ... }<br>}` | --- ## 3. 总结与行动建议 ### 🚨 优先修复的关键问题 1. **立即修复 SQL 注入**:所有涉及 `$this->db->query()` 且包含外部参数的语句必须改为参数绑定或 Query Builder 链式调用。这是最高优先级安全项。 2. **移除文件顶部 `$CI` 调用**:避免框架初始化冲突,将依赖加载移至构造函数或方法内部。 3. **修正 `unset($row)` 逻辑缺陷**:改用键值遍历 `unset($list[$key])` 或 `array_filter`,防止返回无效套餐数据导致前端展示异常。 ### 🛠 后续重构与优化方向 1. **架构解耦与 DRY 重构**: - 将 `get_package_price_list` 与 `get_screen_list` 中重复的“社区模式时间过滤”、“营业日计算”、“套餐分类”逻辑抽离为独立的私有方法或 Service 类。 - 建议引入 **Repository 模式** 或 **Query Object 模式**,将复杂的 SQL 拼接与条件组装从 Model 中剥离,提升可测试性。 2. **统一数据访问层**: - 废弃原生 `$this->db->query()`,全面迁移至框架 Query Builder。利用 `$this->db->like()`, `$this->db->where()`, `$this->db->join()` 等内置方法,自动处理转义与缓存。 - 静态缓存变量 `$_shop_id_arr` 仅在当前请求有效,若需跨请求缓存,建议接入 Redis/Memcached 驱动。 3. **规范与可维护性提升**: - 严格遵循 PSR-12 命名规范,补充 PHPDoc 类型声明,便于 IDE 静态分析与团队协作。 - 折扣计算逻辑(如 `/10`、`/10`)建议封装为独立的 `PriceCalculator` 工具类,避免浮点数精度丢失(可改用 `bcmath` 扩展或整数分单位计算)。 > 💡 **框架适配提示**:代码特征高度符合 **CodeIgniter 3** 架构。若 `phpci` 为内部定制框架,请确认 `$this->db->query()` 是否支持参数绑定、`$this->load->model()` 的加载机制是否与 CI 一致。建议查阅 `phpci` 官方文档中关于 **Query Builder 安全规范** 与 **模型生命周期** 的说明,以确保最佳实践对齐。 --- *此 Issue 由代码审查服务自动创建*
...
milestone_id
0
priority
0
is_closed
0
is_pull
0
num_comments
0
ref
deadline_unix
0
created_unix
1780640589
updated_unix
1780640589
closed_unix
0
is_locked
0
content_version
0
time_estimate
0
Delete
Cancel