Skip to content

fix:重构 QQ 系统,并修复了一些安全问题 - #1411

Open
Sualiu wants to merge 2 commits into
mirai-mamori:patchfrom
Sualiu:security202606
Open

fix:重构 QQ 系统,并修复了一些安全问题#1411
Sualiu wants to merge 2 commits into
mirai-mamori:patchfrom
Sualiu:security202606

Conversation

@Sualiu

@Sualiu Sualiu commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

原 QQ 方案使用 AES 加密 QQ 号后拼接到 URL,再由后端解密获取。这种“自加密自解密”方式保护力度弱,且原实现存在 IV 不匹配、密钥未定义等严重 Bug。此外,原代码存在 SSRF、XSS 及直接操作 $_GET 等安全问题。

几乎可以说原有方案是一个半成品。

本 PR 废弃了加密方案,改用 comment_id 代理模式,彻底避免 QQ 号出现在任何 URL 中,同时修复了多项安全漏洞并引入文件缓存机制。

所有变更经过了自动化测试,代码由 AI 模型 GLM-5.2 辅助编写, 人工审阅,未发现异常,符合 WordPress 官方相关最佳实践要求。

主要变更

  1. inc/classes/QQ.php (核心重写)
  • 删除 get_qq_avatar($encrypted) 及相关加解密逻辑。
  • 新增 get_qq_avatar_data($comment_id):通过 comment_id 读取评论 meta 中的 QQ 号,向后端请求 qlogo 接口并返回二进制数据。引入 wp-content/cache/qq-avatars/ 文件缓存(7天 TTL,按 QQ 号 md5 共享缓存)。
  • 新增 get_qq_avatar_url() 和 get_qq_avatar_url_ptlogin2()。
  • 修复 get_qq_info() 中的 SSRF 漏洞,增加输入格式校验,将 file_get_contents 替换为 wp_remote_get,并修复逻辑分支不完整的问题。
  1. inc/api.php (REST API 重构)
  • 路由参数:/qqinfo/avatar 路由参数由 qq (密文) 改为 comment_id (整数),增加参数校验。
  • 回调重写:get_qq_avatar 改为代理模式。成功时直接输出二进制流并设置 24 小时浏览器缓存;失败时返回 HTTP 404,利用前端原生 onerror="imgError(this,1)" 触发降级,替换为主题缺省头像。
  • 安全修复:移除对 $_GET 的直接访问,改用 $request->get_param(),并启用 REST API 的 nonce 校验。
  1. functions.php (前端逻辑与迁移)
  • change_avatar() 重写:移除对 $sakura_privkey 的依赖,适配新选项(direct/ptlogin2/proxy)。对输出到 HTML 的 QQ 号增加 esc_attr(urlencode()) 防 XSS。
  • 配置迁移:增加 qq_avatar_link_migration() 函数。利用 transient 确保只执行一次,将旧配置平滑映射到新配置(off→direct, type_1/2→proxy, type_3→ptlogin2)。
  1. opt/options/theme-options.php (后台选项更新)
  • 选项值重命名为语义化名称:direct, ptlogin2, proxy。
  • 更新标签描述,明确标注各模式下“QQ 号是否可见”,默认值改为 direct。

修复的问题

  • SSRF 漏洞(file_get_contents 请求外部 URL)。
  • 加解密 IV 不匹配、$sakura_privkey 未定义可能导致的 Fatal Error。
  • 正则匹配 $matches[0] / $matches[1] 未定义索引。
  • REST API 直接访问 $_GET 绕过框架安全检查。
  • type_2 模式二进制输出损坏、错误处理不当。
  • Proxy 模式无缓存导致重复出站请求,增加后端负担。
  • QQ 号输出未转义导致的潜在 XSS。
  • 密钥不存在时回退到硬编码 URL,旧选项值无平滑迁移。

i18

因需进一步确认,未同步更新翻译主题设置框架功能简介。

兼容性

  • 数据库:无结构变更,new_field_qq 字段保持不变。
  • 配置升级:内置一次性迁移脚本,老用户升级后配置自动转换为新值,行为平择过渡。
  • 文件系统:缓存目录 wp-content/cache/qq-avatars/ 自动创建;若不可写则自动降级为不缓存(每次请求 qlogo,依赖浏览器缓存缓解压力)。
  • 前端:保留了原始的 lazyload 懒加载和 imgError 降级机制,无改动前端。

@Sualiu Sualiu changed the title fix(QQ头像): 重构 QQ 账户资料系统,修复 SSRF/加密缺陷/XSS 等 17 项问题 fix:重构 QQ 系统,并修复了一些安全问题 Jun 19, 2026
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

这个 PR 已经 45 天没有任何活动了,将被标记为过时 stale 。 删除 stale 的标签或评论,否则将在 10 天内关闭。

@github-actions github-actions Bot added the Stale label Aug 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant