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
Update row 174 in issue
id
Primary key.
INTEGER NOT NULL
repo_id
INTEGER
index
INTEGER
poster_id
INTEGER
original_author
TEXT
original_author_id
INTEGER
name
🔍 代码审查报告:pay-260519 - 1
TEXT
content
## 自动代码审查报告 **分支**: pay-260519 **提交**: `cdacd84f9016e1024221f4b7a4666b5c44d76979` **提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com) **时间**: 2026-05-19 11:30:11 --- ## 1. 审查摘要 - **代码质量评分**:5.5 / 10 分 - **总体评价**:该 Model 承载了复杂的套餐查询、价格计算、社区模式过滤及多端展示逻辑,业务覆盖全面。但存在**严重的 SQL 注入风险**、**数组引用操作逻辑缺陷**、**多处重复代码**及**框架使用不规范**等问题。部分核心逻辑未做边界保护,且硬编码与魔法数字较多,可维护性与安全性亟待提升。 - **风险等级**:🔴 高(存在直接拼接 SQL 的注入漏洞、关键过滤逻辑失效风险) > 📌 **框架说明**:代码特征(`get_instance()`、`$this->load->model()`、`$this->db->query()`)高度符合 **CodeIgniter 3** 规范。若 `phpci` 为贵司内部定制框架,请结合其官方文档对底层 DB/Model 行为进行适配验证。 --- ## 2. 问题详情 | 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) | | :--- | :--- | :--- | :--- | :--- | | 🔴 严重 | `get_book_package_list()`<br>`get_hot_sale_top5()`<br>约 450~520 行 | **SQL 注入漏洞**:直接使用字符串拼接构造 SQL,未对 `$param['special_merchant_id']`、`$shop_name`、`$shop_id` 进行类型转换或转义。攻击者可构造恶意参数篡改查询逻辑或拖库。 | 1. 强制类型转换 `(int)`<br>2. 使用 CI3 Query Builder 或 `$this->db->escape()`<br>3. 避免手动拼接 `LIKE` 和 `IN` | ```php<br>// 错误<br>$sql .= " AND `shop`.`_name` like '%" . $shop_name . "%'";<br><br>// 正确<br>$shop_name = $this->db->escape_like_str($shop_name);<br>$sql .= " AND `shop`.`_name` LIKE '%{$shop_name}%'";<br>``` | | 🔴 严重 | `get_package_price_list()`<br>`get_screen_list()`<br>约 110/280 行 | **`unset($row)` 逻辑失效**:在 `foreach ($list as &$row)` 中使用 `unset($row)` 仅销毁引用变量,**不会从原数组中移除元素**,导致无效数据仍被返回。 | 使用键值遍历并 `unset($list[$key])`,或改用 `array_filter()` | ```php<br>foreach ($list as $key => &$row) {<br> if ($book_arrival_time < $order_end_time) {<br> unset($list[$key]);<br> continue;<br> }<br>}<br>``` | | 🟠 警告 | 全局顶部<br>`$CI = &get_instance();` | **全局实例化 CI 对象**:在类外部直接调用 `get_instance()` 会在文件被 `include` 时立即执行,若未处于 CI 生命周期内将导致 Fatal Error。且 Model 内部已可通过 `$this` 访问 Loader/DB。 | 删除顶部代码,在方法内部按需使用 `$this->load` 或 `$this->db`。若必须使用 CI 实例,应在方法内局部获取。 | ```php<br>// 删除顶部<br>$CI = &get_instance();<br>$CI->load->model('Simple_model');<br><br>// 类内直接使用<br>$this->load->model('Ahead_vip_model');<br>``` | | 🟠 警告 | 多个方法内<br>`$this->load->model()` | **重复加载模型**:同一模型在多个方法甚至同一方法内被反复 `load`,增加 I/O 开销。CI3 的 `load->model()` 虽会缓存,但频繁调用仍影响可读性与性能。 | 将常用模型移至 `__construct()` 统一加载,或使用懒加载+静态缓存。 | ```php<br>public function __construct() {<br> parent::__construct();<br> $this->load->model(['Ahead_vip_model', 'Ahead_yc_merchant_model', 'ahead_room_package_model']);<br>}<br>``` | | 🟠 警告 | `get_package_price_list()`<br>`get_screen_list()` | **DRY 原则违反**:社区模式时间过滤逻辑(`$book_arrival_time` 计算、包厢结束时间判断)在两个方法中完全重复。后续修改易遗漏。 | 抽取为私有方法 `private function _check_community_package_visibility($list, $params)` | 见下方重构建议 | | 🟡 建议 | 全局多处 | **命名与规范不一致**:类名 `Ahead_room_package_infos_model` 为蛇形,方法名混用驼峰(`getPackageInfoByIds`)与蛇形;魔法数字(`4`, `2`, `100`, `86400`)散落;保留 `//edit by nan` 等提交注释。 | 遵循 PSR-12:类名 PascalCase,方法名 camelCase;提取常量;清理历史注释。 | ```php<br>const SCREEN_RENEW_TYPE = 4;<br>const SECONDS_PER_DAY = 86400;<br>const DISCOUNT_DIVISOR = 100; // 原 /10/10<br>``` | | 🟡 建议 | `get_package_by_fields()`<br>`get_book_package_list()` | **状态污染风险**:`$this->set_table_name()` 与 `$this->set_select_db()` 修改了 Model 全局状态。若并发请求或后续链式调用未正确恢复,会导致数据错乱。 | 使用局部变量或 CI3 的 `clone` 机制;确保 `try-finally` 或显式恢复状态。 | ```php<br>$originalTable = $this->table_name;<br>$this->set_table_name($table_name . ' info');<br>// ... 查询逻辑 ...<br>$this->set_table_name($originalTable); // 必须恢复<br>``` | --- ## 3. 总结与行动建议 ### 🔑 优先修复项(P0/P1) 1. **彻底修复 SQL 注入**:所有 `$this->db->query($sql)` 必须替换为 Query Builder (`$this->db->select()->from()->where()->get()`) 或严格使用 `$this->db->escape()`。禁止直接拼接用户输入。 2. **修正数组过滤逻辑**:全局搜索 `unset($row)` 在 `foreach` 引用中的用法,统一改为 `unset($array[$key])` 或使用 `array_filter()`,确保数据过滤生效。 3. **清理全局 `$CI` 实例**:移除文件顶部的 `get_instance()`,避免框架初始化异常。 ### 🛠 后续重构与优化方向 1. **逻辑抽取与 DRY**:将 `get_package_price_list` 与 `get_screen_list` 中重复的“社区模式时间校验”、“套餐价格折扣计算”、“商品口味拼接”抽取为独立的 `private` 辅助方法,降低维护成本。 2. **折扣计算语义化**:当前 `$rate / 10 / 10` 逻辑隐晦,建议统一在配置层或常量中定义折扣乘数(如 `0.95`),并在计算时直接相乘,避免连续除法带来的浮点精度隐患。 3. **模型状态隔离**:若 `set_select_db()` 为自定义多库切换方法,建议封装为带回调的上下文管理器,确保执行完毕后自动切回默认库,防止请求间状态泄漏。 4. **规范与静态分析**: - 启用 `PHP_CodeSniffer` (PSR-12) 与 `PHPStan` 进行自动化检查。 - 将魔法数字提取为类常量,提升可读性。 - 移除所有 `//edit by xxx` 注释,依赖 Git 历史追踪变更。 > 💡 **局限性说明**:提供的代码在 `get_book_package_list_group_by_shop()` 处被截断,未能审查完整逻辑。若该方法涉及分页、排序或复杂 JOIN,请补充完整代码以便进行针对性评估。 --- *此 Issue 由代码审查服务自动创建*
TEXT
milestone_id
INTEGER
priority
INTEGER
is_closed
INTEGER
is_pull
INTEGER
num_comments
INTEGER
ref
TEXT
deadline_unix
INTEGER
created_unix
INTEGER
updated_unix
INTEGER
closed_unix
INTEGER
is_locked
INTEGER NOT NULL (default 0
content_version
INTEGER NOT NULL (default 0
time_estimate
INTEGER NOT NULL (default 0
Update
Cancel