本文记录了一次真实的 XSS 攻击事件,详细分析问题原因并提供两种可行的修复方案,帮助遇到类似问题的用户快速恢复系统正常运行。
事件背景
作为博客维护者,我们总是希望与读者保持良好的互动,评论功能就成为了必不可少的交流渠道。然而,在 2025 年 11 月,我的 Halo 博客系统遭遇了一次 XSS 攻击,导致评论管理功能受损。
问题现象
攻击者通过直接调用接口提交了两条特殊的评论:
- [XSS](javascript:alert(1)) - 明显的 XSS 攻击代码
- test comment - 普通的测试评论

在这之后,Halo 的评论管理页面出现了以下异常:
- ❌ 评论列表页面完全无法访问
- ✅ 但可以正常打开"精选评论"和"最近评论"
- 💥 页面显示"服务器内部发生错误,请稍后再试"

问题原因
经过GitHub社区大佬的深入排查,发现问题的根本原因在于:
数据库中的这两条异常评论数据缺少 spec.subjectRef 必需的 version 字段,这很可能是攻击者直接调用接口导致的。
技术细节说明
在 Halo 的数据库结构中:
- spec.subjectRef 是一个引用字段,用于关联评论与对应的文章/页面
- 完整的引用应该包含 name、kind 和 version 三个必要字段
- 攻击者通过非正常途径创建了数据结构不完整的评论记录
- 当管理界面尝试加载这些损坏的数据时,由于无法正确解析引用关系,导致服务器抛出内部错误
解决方案
方案一:使用 Data Studio 可视化修复
这是最直观安全的修复方式,通过 Halo 官方插件进行操作修复损坏的数据:
操作步骤:
-
安装 Data Studio 插件
- 在 Halo 后台找到并安装"数据工厂(Data Studio)"插件
-
定位异常数据
- 进入"工具" → “Data Studio”
- 在 Comment 表中找到异常的评论数据

-
修复数据结构
- 直接删除会卡在"删除中"状态无法成功

- 需要在 spec.subjectRef 中添加缺失的字段:“version”: “v1alpha1”

- 直接删除会卡在"删除中"状态无法成功
-
完成修复
- 保存修改后,数据恢复正常状态
- 此时可以顺利删除恶意评论
方案二:删除恶意评论
对于熟悉数据库操作的用户,可以通过 SQL 命令快速处理,如果无法立即确定正确的 version 值,也可以先删除问题数据:
-- 查找包含 XSS 代码的评论记录
SELECT name FROM extensions WHERE convert_from(data,'UTF8')LIKE '%javascript:alert(1)%';
-- 执行结果示例:
-- /registry/microimmersion.webjing.cn/recentcomments/recent-comment-xbr6ag5e
-- /registry/content.halo.run/comments/1ca2d9b4-18cb-41a3-b179-509e2817fd4e
-- 删除识别出的恶意评论
DELETE FROM extensions WHERE name='/registry/microimmersion.webjing.cn/recentcomments/recent-comment-xbr6ag5e';
DELETE FROM extensions WHERE name='/registry/content.halo.run/comments/1ca2d9b4-18cb-41a3-b179-509e2817fd4e';
什么是 XSS 攻击?
XSS(跨站脚本攻击)是一种常见的网络安全漏洞,攻击者通过在网页中注入恶意脚本,当其他用户浏览该页面时,这些脚本会被执行,从而盗取用户信息、会话 cookie 等敏感数据。
在此次事件中,攻击者不仅实施了典型的 XSS 代码注入,还通过直接调用 API 绕过了前端的数据完整性校验,造成了更深层次的影响。
经验总结
备份是关键:定期备份真的很重要,如果此次事件中,我有良好的备份习惯可以就可以快速修复问题,安全之路永无止境,每一次事故都是提升的机会。
本文基于真实安全事件撰写,相关技术细节已在 GitHub Issue #7890 中与 Halo 开发团队分享。特别感谢社区技术大佬提供的深度分析和技术支持。
默认评论
Halo系统提供的评论