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

推荐订阅源

AI
AI
博客园 - 叶小钗
Blog — PlanetScale
Blog — PlanetScale
Microsoft Azure Blog
Microsoft Azure Blog
Vercel News
Vercel News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
A
About on SuperTechFans
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
Martin Fowler
Martin Fowler
阮一峰的网络日志
阮一峰的网络日志
D
Docker
Jina AI
Jina AI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The Register - Security
The Register - Security
J
Java Code Geeks
S
SegmentFault 最新的问题
月光博客
月光博客
G
Google Developers Blog
美团技术团队
Last Week in AI
Last Week in AI
L
LangChain Blog
Apple Machine Learning Research
Apple Machine Learning Research
T
The Blog of Author Tim Ferriss
腾讯CDC
Recent Announcements
Recent Announcements
Recorded Future
Recorded Future
The Cloudflare Blog
有赞技术团队
有赞技术团队
博客园_首页
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
B
Blog
I
InfoQ
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
F
Fortinet All Blogs
B
Blog RSS Feed
Engineering at Meta
Engineering at Meta
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Microsoft Security Blog
Microsoft Security Blog
MongoDB | Blog
MongoDB | Blog
爱范儿
爱范儿
D
DataBreaches.Net
F
Full Disclosure
M
MIT News - Artificial intelligence
博客园 - 司徒正美
H
Help Net Security

青萍叙事

什么都想做,是一人企业最贵的病 小程序上线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 打造个人知识管理系统 给 Hermes 装上本地记忆:Hindsight 自部署完整记录 给 Hermes Agent 装上慧眼:GLM 视觉 MCP Server 配置指南 AI 配音多音字踩坑记 DeepSeek 5月六连崩,是时候重视 LLM API 故障转移了 做内容为什么最好用真人配音 青萍AI语音开放真人配音师入驻 给 Hermes 装上真记忆:Hindsight 上手指南 Hermes 多 Agent 管理指南 邀请有礼:把好用的 AI 工具分享出去,和朋友一起拿积分 Hermes Agent 基础配置指南:从零搭建你的 AI 管家 推荐一个免费在线音频编辑器,像剪映一样好用 我把小说变成了有声故事,而且每个人物都有自己的声音 FunASR 语音识别:让声音变成可编辑的文字 FFmpeg 音频格式转换实用指南 青萍AI语音多人对话模式:5分钟快速生成播客 青萍创作者平台伙伴共创计划正式启动 免费开源的 Screen Studio 平替!OpenScreen 让你的产品演示瞬间专业起来 语音合成入门:SSML 标记语言快速上手 还在为配音头疼?我宣布:这个免费工具彻底治愈了我 青萍AI语音:用 AI 重新定义你的声音 OpenClaw 记忆对比:向量化 VS Markdown,到底该怎么选? 建站一周年:从 NotionNext 迁移到 Hexo 安知鱼
个人博客第一次被攻击,评论区被植入恶意代码全记录
青萍叙事 · 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 等)只是辅助,最根本的还是开发者在代码层面做好输入过滤和输出转义。

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

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