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 556 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-260616 - 1
TEXT
content
## 自动代码审查报告 **分支**: pay-260616 **提交**: `d7c7fccdad7e6360148f8713db8bb5dd08c17763` **提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com) **时间**: 2026-06-05 13:42:54 --- > **注**:根据代码结构(`$CI = &get_instance()`、`system/`、`application/models/`、`$this->load->model()` 等特征),该代码实际基于 **CodeIgniter 3 (CI3)** 框架开发。`phpci` 通常为 PHP 持续集成服务器而非业务框架。以下审查将严格基于 CI3 架构规范与 PHP 现代最佳实践进行。 ## 1. 审查摘要 - **代码质量评分**:6.5 / 10 分 - **总体评价**:代码实现了较为复杂的卡券/团购业务逻辑,具备批量查询与数据聚合意识。但存在明显的 SQL 注入隐患、类外部实例化 CI 超对象、核心方法过长违反单一职责原则、硬编码魔法值及强依赖全局函数等问题。整体业务可运行,但安全性、可维护性与扩展性存在较大优化空间。 - **风险等级**:🔴 高 ## 2. 问题详情 | 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) | | :--- | :--- | :--- | :--- | :--- | | 🔴 严重 | `Ahead_merchant_gift_model.php` L2<br>`Ahead_shop_group_buying_coupon_model.php` L2 | **类外部调用 CI 超对象**:在文件顶部执行 `$CI = &get_instance();`。CI3 模型由框架动态实例化,此写法在文件被 `include` 时若 CI 未初始化会引发致命错误,且模型内部可直接使用 `$this` 访问超对象。 | 删除文件顶部的两行代码。模型内部直接使用 `$this->load->model()` 或依赖 CI 自动加载机制。 | `// 删除顶部代码,类内直接使用:<br>$this->load->model('Simple_model');` | | 🔴 严重 | `Ahead_merchant_gift_model.php` L285, L365, L410<br>`Ahead_shop_group_buying_coupon_model.php` L35 | **SQL 注入风险**:使用字符串拼接构造 `WHERE` 条件(如 `'_shop_id=' . $shop_id . ' or FIND_IN_SET...'`),完全绕过 CI3 查询构建器的参数绑定机制。 | 使用 `$this->db->escape()` 转义变量,或改用查询构建器分组条件。 | `$shop_id = $this->db->escape($shop_id);<br>$where['where'][] = "(_shop_id = $shop_id OR FIND_IN_SET($shop_id, _satisfy_shop_ids))";` | | 🟠 警告 | `Ahead_merchant_gift_model.php` L150-L350 (`create_gift_data`) | **严重违反单一职责原则 (SRP)**:方法长达 200+ 行,类型 `2/3/4/5-8` 的数据组装逻辑高度重复,嵌套深、分支多,极易引入回归 BUG。 | 抽取公共组装逻辑为私有方法(如 `_build_coupon_payload()`),或使用策略模式按 `_type` 分发处理。 | `private function _build_coupon_payload($type, $item, $time) {<br> // 统一处理时间、数量、基础字段<br> return $payload;<br>}` | | 🟠 警告 | 多个文件多处 | **重复加载模型**:在业务方法中频繁调用 `$this->load->model()`。CI3 虽支持懒加载,但重复调用会消耗 I/O 与内存,且不符合规范。 | 将高频依赖模型移至 `__construct()` 中加载,或配置 `autoload.php`。 | `public function __construct() {<br> parent::__construct();<br> $this->load->model(['ahead_merchant_goods_model', 'ahead_wares_package_model']);<br>}` | | 🟠 警告 | `Ahead_merchant_gift_model.php` L435, L440, L465 | **硬编码魔法值**:支付方式 `'1','3','22'`、时间常量 `86400`、类型数字直接写死,缺乏语义且修改成本高。 | 定义类常量或独立配置文件。时间计算建议引入 `DateTime` 或 `Carbon`。 | `const PAY_WECHAT = '1';<br>const PAY_VIP = '3';<br>const SECONDS_PER_DAY = 86400;` | | 🟡 建议 | 全局多处 | **强依赖全局函数**:大量使用 `throwError()`, `turn_array_key()`, `timeToHour()` 等全局函数,破坏 OOP 封装,不利于单元测试与静态分析。 | 改用 PHP 原生 `Exception` 抛出异常,或将工具函数封装为 `Helper`/`Service` 类通过依赖注入使用。 | `throw new \InvalidArgumentException('非法的支付方式');` | | 🟡 建议 | `Ahead_merchant_gift_model.php` L155, L160 等 | **数组语法不统一**:混用 `array()` 与 `[]`。PSR-12 明确推荐使用短数组语法 `[]`。 | 全局替换为 `[]`,保持代码风格一致,提升可读性。 | `$reArr = []; $new_coupon = ['5' => [], '6' => []];` | | 🟡 建议 | `Ahead_merchant_gift_model.php` L115, L118 | **时间计算逻辑冗余**:`strtotime(date('Ymd 8:00:00', strtotime("+$validity day", $excute_time)))` 多次类型转换,易受服务器时区影响且性能不佳。 | 使用 `DateTime` 对象进行日期运算,语义清晰且安全。 | `$dt = (new DateTime())->setTimestamp($excute_time);<br>$dt->modify("+$validity day")->setTime(8,0,0);<br>$expire_time = $dt->getTimestamp();` | ## 3. 总结与行动建议 ### 🔑 优先修复的关键问题 1. **立即修复 SQL 注入隐患**:所有涉及 `FIND_IN_SET` 或字符串拼接的 `WHERE` 条件必须使用 `$this->db->escape()` 或查询构建器参数绑定。这是当前最高危的安全漏洞。 2. **移除类外部的 `$CI = &get_instance();`**:该写法在 CI3 中属于反模式,极易在特定加载顺序下导致 `Fatal Error`。 3. **统一错误处理机制**:将 `throwError()` 替换为 `throw new \Exception()` 或 CI3 的 `show_error()`,确保异常能被全局错误处理器捕获并记录日志。 ### 🛠 后续重构与优化方向 1. **拆分 `create_gift_data` 方法**: - 将按类型(商品券、套餐券、折扣券等)的数据组装逻辑抽离为独立的私有方法。 - 使用 `switch` 或策略模式替代冗长的 `if/elseif` 链,降低圈复杂度(Cyclomatic Complexity)。 2. **数据库设计优化**: - `_satisfy_shop_ids` 使用逗号分隔字符串存储,违反第一范式(1NF),导致 `FIND_IN_SET` 查询无法走索引。建议拆分为关联表 `ahead_merchant_gift_shop`,改用 `JOIN` 或 `IN` 查询,大幅提升查询性能。 3. **引入现代 PHP 特性**: - 使用 `declare(strict_types=1);` 开启严格类型检查。 - 逐步替换全局工具函数为面向对象的服务类,便于后续迁移至 CI4 或 Laravel 等现代框架。 4. **框架适配规范**: - 若项目确需长期维护,建议将自定义的 `Simple_model` 逐步对齐 CI3 官方 `CI_Model` 规范,或考虑升级至 CI4(原生支持 PSR-4、依赖注入、严格类型)。 > 💡 **局限性说明**:本次审查基于提供的代码片段。部分全局函数(如 `turn_array_key`, `timeToHour`, `throwError`)及基类 `Simple_model` 的具体实现未提供,若其内部已做安全过滤或缓存处理,部分风险等级可适当下调。建议结合完整项目上下文进行二次验证。 --- *此 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