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 371 in issue
id
Primary key.
INTEGER NOT NULL
repo_id
INTEGER
index
INTEGER
poster_id
INTEGER
original_author
TEXT
original_author_id
INTEGER
name
🔍 代码审查报告:app - Merge pull request '1' (#36) from app-260519 into
TEXT
content
## 自动代码审查报告 **分支**: app **提交**: `6072fd6c6dfe7531a91425afd26af36ccca6fde5` **提交人**: zhangjunnan (121158035@qq.com) **时间**: 2026-05-27 16:20:12 --- ## 1. 审查摘要 - **代码质量评分**:4.5 / 10 分 - **总体评价**:代码实现了较为复杂的业务逻辑(预订、退款、支付流水、Redis缓存、第三方API交互等),但存在大量历史遗留写法。主要问题集中在:**硬编码敏感凭证、非原子性分布式锁、高频短连接导致性能瓶颈、事务边界缺失导致数据不一致风险、以及使用了 PHP 7.2+/8.0+ 已废弃/移除的语法**。整体架构偏向“脚本式”堆砌,缺乏面向对象设计与单一职责原则的约束。 - **风险等级**:🔴 高(存在凭证泄露、数据不一致、现代 PHP 版本兼容性致命错误) > 📌 **框架说明**:根据目录结构 (`system/`, `application/`)、`get_instance()`、`$this->load->model()` 及 `$this->db->trans_start()` 等特征,判定实际框架为 **CodeIgniter 3 (CI3)**。以下审查与建议均基于 CI3 规范与现代 PHP (7.4+/8.0+) 标准。若代码片段末尾截断导致部分逻辑未完整展示,已作标注说明。 ## 2. 问题详情 | 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) | | :--- | :--- | :--- | :--- | :--- | | 🔴 严重 | `common_helper.php`<br>`alioss_*` 函数 | **硬编码云存储密钥**:`accessId` 与 `accessKey` 直接写死在代码中,极易随代码库泄露,导致 OSS 被恶意读写或产生高额账单。 | 移至 `application/config/oss.php` 或环境变量,通过 CI 配置加载。生产环境严禁硬编码。 | `$param = $CI->config->item('aliyun_oss');`<br>`$obj = new Alioss($param);` | | 🔴 严重 | `common_helper.php`<br>`doRedisLockRelease` | **分布式锁释放非原子**:先 `get()` 判断再 `del()`,高并发下存在竞态条件,可能误删其他进程持有的锁。 | 使用 Lua 脚本保证 `GET` 与 `DEL` 的原子性。 | `if ($redis->eval("if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end", [$key, $value]) == 1) { return true; }` | | 🔴 严重 | `common_helper.php`<br>`decodeUnicode` | **使用已废弃函数**:`create_function()` 在 PHP 7.2 已废弃,PHP 8.0 彻底移除,会导致致命错误。 | 替换为匿名函数(Closure)。 | `preg_replace_callback('/\\\\u([0-9a-f]{4})/i', fn($m) => mb_convert_encoding(pack('H*', $m[1]), 'UTF-8', 'UCS-2BE'), $str);` | | 🔴 严重 | `common_helper.php`<br>`getFirstCharter` | **字符串访问语法废弃**:`$str{0}` 在 PHP 7.4 标记废弃,PHP 8.0 移除。 | 统一改为方括号 `$str[0]`。 | `$fchar = ord($str[0]);` | | 🟠 警告 | `common_helper.php`<br>所有 `rs_*` 函数 | **Redis 连接频繁创建/销毁**:每个函数独立调用 `get_aliyun_redis_conn()` 并 `close()`,高频调用将耗尽 TCP 连接池,严重拖慢响应。 | 封装为单例连接池,或直接使用 CI3 内置的 `Cache` Redis 驱动复用连接。 | `// 推荐改用 CI Cache 驱动<br>$this->load->driver('cache', ['adapter' => 'redis']);<br>$this->cache->redis->sMembers($key);` | | 🟠 警告 | `Ahead_book_order_change_pay_log_model.php`<br>`refund()` | **事务边界缺失**:先执行 `$this->update()` 修改数据库状态,再调用 `wx_refund()`。若微信退款失败,数据库状态已变更为“已退款”,导致资金与状态不一致。 | 使用 `$this->db->trans_start()` 包裹整个流程,或采用“先调API,成功后再更新DB”的补偿机制。 | `$this->db->trans_start();`<br>`// 1. 调微信退款<br>`// 2. 成功后更新DB<br>`$this->db->trans_complete();` | | 🟠 警告 | `common_helper.php`<br>`curlRequest` | **关闭 SSL 证书验证**:`CURLOPT_SSL_VERIFYPEER = false` 使请求易受中间人攻击(MITM),敏感数据可能被劫持。 | 生产环境必须开启验证,并配置 CA 证书路径。 | `curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);`<br>`curl_setopt($curl, CURLOPT_CAINFO, APPPATH.'config/cacert.pem');` | | 🟠 警告 | `Ahead_pay_log_model.php`<br>`update_refund_amount` | **SQL 拼接注入风险**:`$up = '_status=4,_refund_amount=_refund_amount+' . $refund_amount;` 若 `$refund_amount` 未严格类型转换,可被注入恶意 SQL。 | 使用 CI 查询构建器或强制类型转换。 | `$this->db->set('_refund_amount', '_refund_amount + ' . (float)$refund_amount, FALSE)->where($where)->update($this->table_name);` | | 🟡 建议 | `common_helper.php`<br>`get_mac_by_url` | **职责过重且重复加载模型**:函数内多次 `if` 分支重复 `$CI->load->model()`,且混杂了 URL 解析、正则、DB 查询,可读性与性能差。 | 提取为独立的 `UrlParserService` 类,模型在构造函数中加载一次,使用策略模式处理不同域名。 | `class MacUrlParser { public function __construct() { $this->CI =& get_instance(); $this->CI->load->model('ahead_family_servers_model'); } ... }` | | 🟡 建议 | `Ahead_book_order_model.php`<br>`refund_by_notify` | **违反单一职责原则**:单个函数超 300 行,混合了状态更新、第三方退款、社区营收计算、日志记录、团购核销等。 | 拆分为 `RefundService`、`RevenueService`、`NotifyService`,核心流程使用事件驱动或消息队列异步处理。 | 将 `send_screen_open_room()`、`order_printer()` 等非核心同步逻辑移至队列或事件监听器。 | | 🟡 建议 | 全局多处 | **CI3 加载规范不符**:文件顶部直接 `$CI =& get_instance();` 或在循环中重复 `$this->load->config()`。 | 遵循 CI3 规范,在 Model 构造函数中统一加载依赖,配置项应缓存或全局加载。 | `public function __construct() { parent::__construct(); $this->load->model('xxx'); $this->config->load('merchant', TRUE); }` | ## 3. 总结与行动建议 ### 🔑 优先修复的关键问题(P0/P1) 1. **移除硬编码凭证**:立即将 `common_helper.php` 中的 OSS `AccessKey/SecretKey` 迁移至配置文件或 `.env`,并检查 Git 历史是否已泄露。 2. **修复 PHP 8.0 兼容性致命错误**:全局替换 `create_function` 为匿名函数,将 `$str{0}` 改为 `$str[0]`。否则升级 PHP 版本后系统将直接崩溃。 3. **修复分布式锁竞态条件**:将 `doRedisLockRelease` 改为 Lua 脚本执行,避免高并发下锁被错误释放导致超卖或重复执行。 4. **统一事务边界**:所有涉及“资金变动+状态更新+第三方API调用”的流程(如 `refund`、`invalid_book`),必须确保数据库事务与外部调用的最终一致性。建议采用 **先调外部API,成功后再落库** 的模式,或引入本地消息表/补偿任务。 ### 🛠 后续重构与优化方向 1. **连接池与性能优化**: - 废弃当前“每次操作新建 Redis 连接”的写法。建议统一使用 CI3 的 `$this->load->driver('cache', ['adapter' => 'redis'])`,或封装一个基于 `Predis`/`PhpRedis` 的单例连接管理器。 - 对 `get_mac_by_url` 等高频解析函数增加本地缓存(如 APCu/Redis),减少重复 DB 查询。 2. **架构解耦与单一职责**: - `Ahead_book_order_model` 和 `Ahead_pay_log_model` 承载了过多业务逻辑。建议引入 **Service 层**,将 Model 仅用于数据存取,业务编排移至 Service。 - 将非核心同步操作(如打印订单、发送通知、更新地图营收数据)剥离至 **消息队列(RabbitMQ/Redis Queue)** 或 CI 的 `Events` 机制,降低主接口响应延迟。 3. **安全与规范加固**: - 开启 `CURLOPT_SSL_VERIFYPEER`,并配置系统 CA 证书。 - 统一使用 CI 查询构建器(Query Builder)替代原生 SQL 字符串拼接,彻底杜绝 SQL 注入隐患。 - 遵循 PSR-12 规范:统一命名风格(驼峰/下划线)、移除冗余注释、使用类型声明(PHP 7.4+ 支持 `declare(strict_types=1);` 及参数类型提示)。 > 💡 **局限性说明**:提供的 `Ahead_pay_log_model.php` 代码在末尾 `refund()` 方法处被截断,未能完整审查其事务回滚与异常处理逻辑。建议补充完整代码后再次进行针对性审查。 --- *此 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