惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
腾讯CDC
D
Docker
G
Google Developers Blog
D
DataBreaches.Net
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
S
SegmentFault 最新的问题
The Cloudflare Blog
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
大猫的无限游戏
大猫的无限游戏
量子位
美团技术团队
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

青萍叙事

小程序用户注册完就不来了?我总结了 3 个召回策略 手机上就能克隆自己的声音,5 秒音频就够了 DeepSeek V4-Flash 正式版来啦,原生支持 Response API 做了一个免费工具,被骂到不再维护,一人企业的现实困境 手把手教你给短视频配音,全程不花钱 签到、邀请、任务中心,一个小程序日活增长的完整复盘 什么都想做,是一人企业最贵的病 小程序上线30天,注册量超过了网站一整年 注册验证码被刷了一整夜,论接口限流的重要性 通过Hermes搭建AI驱动的全自动安全封禁系统 博客被攻击之后,我部署雷池防火墙给网站穿上防弹衣 青萍AI图床:AI 生图接口文档 真心建议做一人企业的你,先把统一认证搞定 从个人公众号迁移到企业公众号经验总结 豆包千问集体下线智能体,是时候拥抱 Hermes Agent 了 配音兼职渠道怎么找?5 种渠道和 1 个避坑提醒 宝妈声音兼职去哪接单:三个平台横评,最后一个免费入驻每日自动派单 Hermes 浏览器工具:让 AI 替你操作网页 Hindsight for OpenCode:给每个项目装上专属记忆库 Hermes v0.17.0 最值得升级的理由:一个进程,管所有 Profile 音频可视化:从波形到视频的三种实现路径 Hermes 定时任务实战 真人配音兼职怎么找:几个渠道对比,末尾推荐一个免费入驻的 AI语音技术到底能做什么 AI漫剧之配音篇 用 Hermes Agent 搭了一条内容生产线 Hermes Gateway 飞书连接断开排查 2026精选5款热门AI配音软件 用 Hermes 打造 LLM Wiki 知识库:Karpathy 方法实战指南 用 Hermes 打造个人知识管理系统
个人博客第一次被攻击,评论区被植入恶意代码全记录
青萍叙事 · 2026-07-11 · via 青萍叙事
网站搭建安全Twikoo安知鱼

个人博客第一次被攻击,评论区被植入恶意代码全记录

前言

今天访问自己的博客时突然发现,页面居然弹出了一个 alert(1) 对话框,再一查是多了一个不存在的异常请求地址:/x。

第一反应是网站被黑了。
排查下来,确实是一次评论区的恶意代码注入攻击。

这篇文章记录完整的发现过程和修复方案,包括封禁攻击者 IP、删除恶意评论、修复主题漏洞三步。

攻击是怎么发生的

这种攻击叫 XSS(跨站脚本攻击),原理不复杂:攻击者把恶意代码注入到网页中,其他访客打开页面时代码自动执行。

这次的攻击路径是这样的:

攻击者在 Twikoo 评论区提交了一条评论,把昵称设成了 <img src=x onerror=alert(1)>

安知鱼主题的最新评论侧边栏组件会调用 Twikoo 的 API 获取最近评论,然后把评论数据拼成 HTML 渲染到页面上。

问题出在拼接 HTML 的环节。
主题模板直接把用户昵称拼进了 innerHTML,没有做任何 HTML 转义,浏览器就把它当成了真正的 <img> 标签来渲染,加载失败后触发了弹窗。

因为 404 页面也带侧边栏最新评论,所以访问任何不存在的路径都会触发弹窗。

攻击者用 alert(1) 只是证明能打
真正危险的攻击可以窃取用户 Cookie、劫持登录态、注入钓鱼页面,后果严重得多。

第一步:全局封禁攻击者 IP

发现攻击后,第一件事是切断攻击来源。

从 Twikoo 后台和 Nginx 访问日志中定位到攻击者的 IP 地址,然后直接在云服务器安全组里封禁。

在阿里云 ECS 的安全组规则里添加一条入站拒绝规则,把攻击者 IP 的所有流量拦在外面,一劳永逸。

封禁 IP 是应急措施,能争取处置时间,但不是长久之计。
攻击者可以换 IP 再来,所以还需要从应用层面加固。

第二步:删除恶意评论,开启评论审核

评论系统的加固分两个动作。

先从 Twikoo 后台手动删除昵称为 <img src=x onerror=alert(1)> 的那条恶意评论,清除已经注入的攻击载荷。

然后在 Twikoo 管理后台开启评论审核功能。
开启后,新提交的评论不会直接显示,需要管理员审核通过后才能展示。

这样即使有人再提交恶意内容,也不会直接暴露给其他访客。

评论审核的代价是降低了互动即时性,但对于个人博客来说,这个权衡是值得的。
安全优先。

第三步:修复评论插件 Bug 并上线

前面两步是治标,这一步才是治本。

漏洞的根因在安知鱼主题的两个模板文件里,侧边栏最新评论组件和中控台最新评论组件都有同样的问题。

两个文件的 generateHtml 函数把 Twikoo 返回的用户数据(昵称、头像、评论内容、链接)直接拼进了 innerHTML,没有做任何 HTML 转义,所以攻击者的昵称被浏览器当成了真正的 HTML 标签来执行。

修复方法是对所有来自用户的数据做 HTML 实体编码,把 <>" 等特殊字符转义成浏览器不会解析的格式。
转义之后,<img src=x onerror=alert(1)> 这种恶意昵称只会被当成普通文字显示,不会被执行。

修复完成后构建验证通过,提交推送到线上。

攻击复盘

回顾这次事件,有几个教训值得记住。

这类攻击的入口往往是评论区、留言板这类用户可自由输入的地方。
任何把用户输入直接拼进 HTML 的操作都是潜在漏洞。

对所有来自用户的数据做 HTML 转义,是前端项目的基本安全底线。
浏览器自带的防护机制(CSP 等)只是辅助,最根本的还是开发者在代码层面做好输入过滤和输出转义。

如果你的博客也用安知鱼主题,建议检查一下评论区组件有没有同样的问题。

你的博客遇到过类似的安全问题吗?评论区聊聊你的经历和应对方式。