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 587 from issue
id
587
repo_id
22
index
71
poster_id
1
original_author
original_author_id
0
name
🔍 代码审查报告:app-260616 - 自助商家可以退兑换的订单
content
## 自动代码审查报告 **分支**: app-260616 **提交**: `7579aebe0
## 自动代码审查报告 **分支**: app-260616 **提交**: `7579aebe01b6a39b8b0d1220156c118c82a79eff` **提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com) **时间**: 2026-06-08 14:02:04 --- ## 1. 审查摘要 - **代码质量评分**:4 / 10 分 - **总体评价**:该模型类承载了大量订单查询、统计报表、分页及退款逻辑,功能覆盖较全。但代码存在**严重的 SQL 注入隐患**、**敏感信息硬编码**、**多处 SQL 语法错误**及**重复的分页实现**。整体架构偏向早期 PHP 开发习惯,未遵循现代 PHP 规范与 MVC 分层原则,可维护性与安全性较低。 - **风险等级**:🔴 高 > 📌 **框架说明**:代码结构、`$this->db` 调用方式及目录特征高度符合 **CodeIgniter 3** 框架。若 `phpci` 为贵司内部定制框架,请结合其官方文档对 Query Builder 语法进行适配。 --- ## 2. 问题详情 | 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) | | :--- | :--- | :--- | :--- | :--- | | 🔴 严重 | 全局多处 | **SQL 注入风险**:大量使用 `$addsql` 字符串直接拼接至 `WHERE` 或 `JOIN` 条件中,未做参数绑定或白名单过滤。若 `$addsql` 来自用户输入,将导致严重注入。 | 废弃字符串拼接,全面改用框架 Query Builder 或预处理语句。若必须动态拼接,需严格校验键名白名单。 | `$this->db->where($safe_conditions)->get('ahead_yc_order');` | | 🔴 严重 | 第 14 行 / `refund()` | **敏感信息硬编码**:`public $encrypt` 及退款方法中的 MD5 盐值(`'1441600902'` 等)直接写死在代码中,且属性为 `public`,极易泄露。 | 移至 `application/config/` 或 `.env` 环境变量,属性改为 `protected`,构造函数中读取。 | `protected $encrypt;`<br>`$this->encrypt = config_item('order_encrypt_key');` | | 🔴 严重 | `get_new_add_people_trend_data` | **SQL 语法错误**:子查询 `NOT IN (select DISTINCT(_ahead_user_id))` **缺失 `FROM` 表名**,执行时将直接抛出数据库语法错误。 | 补全子查询表名及关联条件,确保逻辑闭环。 | `NOT IN (SELECT _ahead_user_id FROM ahead_yc_order WHERE _merchant_id = ?)` | | 🔴 严重 | `cjy_consumption_trend_data` | **Query Builder 键名错误**:`$where['_merchant_id='] = $merchant_id;` 不符合 CI 规范,键名中的 `=` 会导致生成的 SQL 异常或条件失效。 | 移除键名中的操作符,使用标准数组键值对。 | `$where['_merchant_id'] = $merchant_id;` | | 🟠 警告 | 多个统计方法 | **模型层越权处理 JSON**:多处使用 `json_encode()` 包装查询结果返回。模型应仅负责数据获取,序列化应交由 Controller 或 API 响应层。 | 移除模型中的 `json_encode()`,直接返回数组。在控制器层统一处理响应格式。 | `return $result['data']; // 移除 json_encode` | | 🟠 警告 | `get_order_manage_by_page` | **强制索引滥用**:通过 `strpos($addsql, '_shop_id')` 判断后硬编码 `force index(_merchant_id)`。索引策略应由 DBA 通过执行计划决定,硬编码易导致全表扫描或索引失效。 | 移除 PHP 层的 `force index`,依赖数据库优化器。若确需优化,应在数据库层建立复合索引 `(merchant_id, shop_id, timestamp)`。 | 删除 `force index` 拼接逻辑 | | 🟠 警告 | `set_page_info` / `get_page_info` / `cjy_get_page_info` | **分页逻辑严重重复**:三处独立实现分页计算、状态判断,代码冗余且易产生边界条件不一致。 | 抽取为独立 `PaginationService` 或 CI Library,统一调用。 | `PaginationHelper::calc($total, $page, $pageSize)` | | 🟡 建议 | 文件顶部 | **模型加载方式错误**:`$CI =& get_instance(); $CI->load->model('Simple_model');` 在类外部执行,违反框架生命周期,且每次文件解析都会执行。 | 移除顶部代码。若需加载父类依赖,应在 `__construct()` 中处理或配置自动加载。 | 删除顶部两行代码 | | 🟡 建议 | 全局 | **代码规范与命名**:变量带 `$_` 前缀属旧式风格;方法过长(如 `get_business` 超 60 行)违反单一职责;缺乏 PHP 7+ 类型声明。 | 遵循 PSR-12,移除 `$_` 前缀,添加类型提示,拆分大方法。 | `public function getOrderInfo(int $merchantId, string $orderId = ''): array` | --- ## 3. 总结与行动建议 ### 🚨 优先修复的关键问题(P0) 1. **修复 SQL 注入漏洞**:立即审查所有传入 `$addsql` 的调用链。若无法短期内全面重构,至少对 `$addsql` 进行严格的正则白名单过滤(仅允许 `字段名 IN (...)` 或 `字段名 = ?` 格式),并强制使用 `$this->db->query($sql, $bindings)` 绑定参数。 2. **修正致命 SQL 语法错误**:修复 `get_new_add_people_trend_data` 中缺失 `FROM` 的子查询,以及 `cjy_consumption_trend_data` 中错误的 Query Builder 数组键名。 3. **移除硬编码密钥**:将 `$encrypt`、退款 MD5 盐值、`PAY_BASE_URL` 等全部迁移至配置文件或环境变量,杜绝生产环境密钥泄露风险。 ### 🛠 后续重构与优化方向(P1/P2) 1. **统一数据访问层 (DAL)**: - 废弃原生 SQL 字符串拼接,全面迁移至框架 Query Builder。 - 将 `json_encode()` 从 Model 剥离,确保 Model 仅返回 `array` 或 `object`。 2. **抽象通用组件**: - 将重复的分页计算逻辑封装为 `PaginationTrait` 或独立 Library。 - 将复杂的报表统计(如二次消费、消费走势)拆分为独立的 `ReportService`,避免 Model 臃肿。 3. **性能与数据库优化**: - 针对 `BETWEEN ? AND ?` 及 `GROUP BY` 高频查询,建议 DBA 添加覆盖索引:`INDEX idx_merchant_shop_time (_merchant_id, _shop_id, _timestamp)`。 - 移除 `force index` 硬编码,改用 `EXPLAIN` 分析慢查询后针对性优化。 4. **现代化 PHP 规范**: - 启用 `declare(strict_types=1);`。 - 为方法参数和返回值添加类型声明(如 `int`, `array`, `bool`)。 - 使用常量类或枚举(PHP 8.1+)替代散落的 `const` 定义,提升可读性。 > ⚠️ **局限性说明**:您提供的代码在末尾处被截断(`$this->ahead_yc_merchant_user_model->get_one(['_id' => $para`)。若截断部分包含权限校验、事务处理或核心业务逻辑,请补充完整代码后重新提交审查。 --- *此 Issue 由代码审查服务自动创建*
...
milestone_id
0
priority
0
is_closed
0
is_pull
0
num_comments
0
ref
deadline_unix
0
created_unix
1780898524
updated_unix
1780898524
closed_unix
0
is_locked
0
content_version
0
time_estimate
0
Delete
Cancel