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

推荐订阅源

F
Fox-IT International blog
Recent Announcements
Recent Announcements
D
Docker
IT之家
IT之家
B
Blog
Jina AI
Jina AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
Google DeepMind News
Google DeepMind News
F
Fortinet All Blogs
量子位
C
Check Point Blog
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
博客园 - 司徒正美
李成银的技术随笔
美团技术团队
Blog — PlanetScale
Blog — PlanetScale
雷峰网
雷峰网
The GitHub Blog
The GitHub Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
T
The Blog of Author Tim Ferriss
酷 壳 – CoolShell
酷 壳 – CoolShell
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
L
LangChain Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
有赞技术团队
有赞技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Visual Studio Blog
T
Tailwind CSS Blog
H
Help Net Security
Engineering at Meta
Engineering at Meta
小众软件
小众软件
B
Blog RSS Feed
Stack Overflow Blog
Stack Overflow Blog
月光博客
月光博客
M
Microsoft Research Blog - Microsoft Research
宝玉的分享
宝玉的分享
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Last Week in AI
Last Week in AI
Martin Fowler
Martin Fowler
Stack Overflow Blog
Stack Overflow Blog

皓子的小站

小心网络地雷·再续 pnpm 的 shellEmulator 对 package.json 脚本的影响 eNSP 预安装虚拟机镜像分享与使用教程 网站字体应用之坑——font-family 篇 糟糕的 meta name="theme-color" How to Automatically Track Newly Supported ESLint Rules in Oxlint How to Gradually Migrate from ESLint to Oxlint (Without Breaking Everything) 静态资源预压缩:零运行时开销,极致节省带宽 CVE-2025-70886 Proof of Concept (PoC) | A Script to Crash Halo CMS Comment Backend 自定义网页鼠标指针——一段曲折的旅程 CVE-2025-70886 漏洞复现/PoC | 一个脚本让 Halo CMS 评论后台瘫痪 2025 年终总结 & 博客两周年 老用户专享!已有 Halo 专业版授权可免费升级商业版 自动追踪 Oxlint 对 ESLint 规则的新增支持 Halo 贡献者证书与实体周边盲盒开箱 博客评论系统指南 CDN 回源跟随配置导致登录异常问题排查 SCDN 免费赞助计划:助力高质量博客&博客圈 锐捷校园网:网络共享与带宽叠加方案(哈理工案例) ESLint 到 Oxlint 渐进式迁移快速上手指南 Fixing Vite Breaking Inline JS & CSS in Thymeleaf Templates 解决 Vite 破坏 Thymeleaf 模板内联 JS & CSS 的方法 我的博客,为什么是月更? 博客俱乐部一周年纪念品开箱 网站字体加载之坑——format 篇 题解分享:[AtCoder Beginner Contest 414 E] Count A%B=C 题解分享:[蓝桥杯 2025 国 Python A] 杨辉三角 P12876 FiF口语训练破解刷分教程(适用于 Windows) 不要与蠢人辩论 小心网络地雷·续篇 当心网络组织“开往”·续篇 当心网络组织“开往” 小心网络地雷 在 Halo CMS 中通过模板实现随机推荐多篇文章 回应某博客上有关“开往”组织在内部会议上对我的污蔑(上) 再遭 DDoS 攻击:CDN 流量限额拦不住请求计费飙升 2025年团体程序设计天梯赛 - Python 个人赛时暴力题解 网站流量分析工具 Umami 中国大陆合规版发布 把握当下,享受生活 Folo 认证功能反成漏洞?警惕 RSS 订阅源所有权被恶意盗取风险 在 Halo CMS 中通过模板实现随机文章跳转功能 从沉默展柜到时代回响:731部队罪证陈列馆参访手记 脚本分享:CDN 流量触顶后自动切换至 Cloudflare 官方 BUG 快薅!Halo 永久/买断用户可额外获得一份买断许可 老用户专享!已有 1Panel 永久授权/买断许可用户可再领免费买断许可证! 限时特惠!1¥ 立即解锁 1Panel 专业版全功能 61 天 混合云架构下的动态 IPv6 智能加速实践:从家庭网络到全球分发的低成本部署指南 如何用 AI 全方面辅助博客创作 - 从博文之内到博文之外 Random Number Generation and Formatting in Thymeleaf Thymeleaf 随机数生成与格式化详解 列举我维护的项目和发布的软件包 快速部署教程 - 通过 Webhook 触发邮件通知的开源自托管服务 Going Against the Grain - Four Websites That Make Your URL Longer 反其道而行 - 四个让你网址变得更长的网站 2024 年终总结 & 博客一周年 基于 OneBot API 的简易异步 QQ 群批量发消息脚本 如何快速完成中文排版优化 如何给文章分类和打标签 群规之敏感违禁词对抗 一图展示​ ​RSS3 世界 - The Open(RSS3) Universe 开源项目发到 bilibili 后可能获得的 PR C/C++:为什么 a[i][j] 等价于 *(*(a+i)+j) Fast Methods to Convert Uppercase Letters to Lowercase in C++ C++ 中快速将字符串大写字母转为小写的方法 Fixing GitHub Actions push to ghcr '403 Forbidden' error Fixing docker pull image "ghcr.io..." Unauthorized error 本站“算法题练习/题解分享”相关文章汇总 不怕流氓多,就怕流氓有文化——站长应该防范的几个问题及对应解决方法分享 题解分享:HRBUST 1132 水数 新手程序员必备的三项技能 如何快速排查插件(模组)的兼容性问题(基于二分法和分治思想) 通过 Umami 最新功能观察定时发布文章的最佳时段 踩坑分享:如何一个人搬运 126.7 斤的书坐动车 两篇文章分享:别像弱智一样提问 & 提问的智慧 论下落式音游/定轨音游中的优质粪铺(文末附铺面推荐) 为什么选择无纸化阅读?为什么买墨水屏电子书?为什么 Kindle“失败”了? 我维护的 Halo 主题,现已发布到 Halo 应用商店! OSU!Standard(osu!std)/OSU!Taiko 转 OSU!Mania 铺面转换器发布 我常用的 OSU!Mania 皮肤分享 电荷守恒辨析:为什么一个离子带多个电荷要乘上所带电荷数而不是除以所带电荷数 注意!align-items: flex-start 会导致 overflow-wrap: break-word 失效 惊人 98 元限定T恤!1Panel, Halo 开发商开启推广积分奖励活动 Minecraft Spigot Bukkit 服务器插件开发 教程收集 中文博客倡议 Windows 10 遇到“只能重装系统”但不想重装的解决方案 Windows 10 文件系统错误 -2144926975 -2147219196 修复 Windows 10 升级 Windows 11 简明教程 CSS 预处理器如何正确的复用样式(stylus 中使用 @extend 继承的坑) 请一定要回复博客下的匿名评论!对于博主和评论者有关匿名评论的倡议 一图解释单一质点运动波动图像和振动图像的关系 解决 Docker pull image "ghcr.io..." Unauthorized error 解决 GitHub Actions push to ghcr '403 Forbidden' error 解决 Umami API 更新延迟问题(如何修改开源项目代码并构建 Docker 镜像-以 Umami 为例) 在国家公祭日自动将网站变灰 中文博客圈列表 解决 Halo CMS 的 Umami Plugin CORS&CSP 跨域报错问题 Windows 创建存储池报错 无法创建池 不支持该请求 (0x00000032) Windows 显示器突然黑白 桌面突然黑白 鼠标和截图还是彩色的 通过指令过滤出正确的公网 IPv6 地址(记一次折腾 IPv6 DDNS) 我的世界免费科技地址 1.7-1.21
经历 1000000000 次 DDoS 请求攻击后,我总结了三条经验
2025-07-23 · via 皓子的小站

2025 年 4 月 24 日到 5 月 5 日期间,我的站点突然遭遇了一波极其猛烈的 HTTP Flood 攻击(被攻击记录,总请求数达到了 1.44B+)。最夸张的一刻,峰值一度冲到每秒 3120 次请求(根据 CloudFlare 的邮件通知)。这真的是一场难以忘记的风暴。事后,我把整个过程捋了一遍,总结了三条经验和避坑要点。如果你有一天也遇上这种情况,或许能帮上点忙。

确保遵循安全原则

安全原则:不要与蠢人辩论,要特别小心网络地雷,并当心这类网络组织

确保 CDN 具备防护功能

一定要选带有安全防护的 CDN,也就是 SCDN。这里说个我自己的典型“反面案例”:

  1. 一开始我使用的是多吉云的 CDN,其封顶措施仅针对流量,无法根据请求数进行有效限制。在遭遇 CC 攻击时,虽然设置了 QPS 限制,但请求数仍然在瞬间被消耗殆尽(并且由于结算存在延迟,只需在 5 分钟的结算延迟窗口内持续刷流量,就完全不会触发封顶设置。对此向客服咨询后,得到的答复是技术限制所致)。最终,封顶机制未被触发,额度用尽后账户立即进入欠费状态。在被 CC 攻击的整个过程中,平台并未提供任何实质性的防护措施。
  2. 我联系客服,客服建议说“你把攻击 IP 拉到黑名单就不会计费了”。然而黑名单居然有上限,根本无法应对大规模攻击。
  3. 于是很尴尬:没防住攻击,也没能及时下线,还额外“亏”了 100~200 块钱费用。要知道,这点钱都够在某大厂 SCDN 个人版用一年(大厂 SCDN 一年才 100.98 元)。

一般而言,普通 CDN 是按所有流量和请求收费,包括正常和攻击流量;SCDN 则是在安全清洗后,只对正常流量和请求计费,对钱包和安全更友好。目前我站迁移到了 WAF.SB(已迁移到新地址:Sharon Networks)。在实际使用中,基于 FlexCDN 系统支持较为细致的规则配置,在本站抵御 DDoS 攻击时发挥了重要作用。

确保配置可靠 WAF 规则

在部署 SCDN 后,务必配合可靠的 WAF(Web 应用防火墙)规则。合理的规则不仅可以实现近源清洗,有效减少回源请求,显著减轻源站压力,同时还能保障正常流量的顺利通过。

借助小絮分享给我的 CloudFlare 规则及 IP 黑名单,我能够有效过滤掉绝大部分恶意请求(高达 99.8%)。同时,XAY 赞助 SCDN,收集到的样本也帮助我进一步完善了防御规则。监控发现,这次攻击全部采用了类似的手法,即构造大量带有不同查询参数的请求,例如:

/?Yh7Fy=5PzufQSA292ZC3gHQ46CJKYQf
/?8qvup=v9ddCspC6SNrlt0U5l86U9p0u
/?pGLKg=7PjbTEAUvgDDqdImWhNRhCvNW
/?mNvFi=AnYthHORM50jiDOnksKLtk3cq
/?4QQMV=I8rmjEfl2EuKW1OfKdygjQ0Y6

因此,我建议各位站长在配置 CDN 缓存时尽量忽略查询参数,以提升防护效果。

当然,“世上没有万无一失的防护”。攻击手法不断变化,CDN 节点策略也可能会有同步延迟。因此,建议再叠加本地 WAF,实现双重保护。这样不仅可以及时手动封禁可疑 IP,还能进一步防止恶意请求渗透到源站,提升整体安全性。

附录

小絮分享的 CloudFlare 规则

采取措施可以设置为质询/禁止。

经过多日测试,质询通过率几乎为 0%(实际质询通过只有 2 次,都是我找在俄罗斯的朋友来帮忙测试产生的)。

规则 1:

(ip.geoip.continent eq "AF") or (http.user_agent contains "Mozilla/4.0") or (not http.request.method in {"GET" "POST" "OPTIONS" "HEAD"}) or (ip.geoip.country in {"BR" "BG" "CA" "DE" "IN" "ID" "IE" "MX" "NL" "PH" "RU" "TH" "VN" "T1" "UZ"}) or (ip.geoip.asnum in {45753 47890} and not cf.client.bot) or (ip.geoip.asnum in {12816 12786 18450 197540 24961 26496 35908 46606 54600 60068 22773 18978 7922 61317 6079 397391 46562 22616 26347 45916 22394 202594 40676 398101 396362 6167 54290 135981 21686 7303 138997 22418 140224 46475 20001 43959 41378 29802 10013 9824 4766 209 43260 7565 40676 3786 28438 13287 3786 24641 7925 60068 200373} and not cf.client.bot) or (ip.geoip.asnum in {14061 20473 2914 16276 24940 8100 45102 36352 135377 63949 54994 3462 35908 14618 16276} and not cf.client.bot)

规则 2:

(ip.geoip.asnum in {6060 6729 7411 9164 11331 11938 17447 22801 23865 24426 24567 25288 26561 26701 27524 30490 32177 32558 34465 34888 34985 35624 35718 35830 37707 38149 38337 38946 39720 40193 40403 40665 40963 41155 41947 42192 42419 42505 42624 42694 43444 43463 43613 43668 43743 44317 44386 44774 44801 44853 46664 47893 47926 47945 48090 48198 48589 49042 49217 49316 50236 50308 50935 51045 51124 51381 51396 51447 51490 53958 55020 55748 56291 56873 57097 57415 57467 57509 57523 57678 58854 59425 59683 60842 61302 61432 61879 62864 63881 64425 131750 132574 132781 132827 132930 133320 133488 133668 133692 133883 133994 135271 135752 136231 136367 136923 137156 138687 138749 138808 138915 139660 139789 140125 140155 140184 140208 140666 140787 140941 141333 141567 141803 141835 141836 141853 141875 142002 142062 142430 142519 146999 147186 147211 147287 147291 149181 149196 149197 149208 149242 149286 149434 150030 150036 150082 150091 150100 150604 150813 150860 151604 152149 152170 152192 152194 152327 152485 152486 153318 197450 197555 198375 198571 198578 198953 199420 199598 199654 200010 200373 200514 200593 200699 201249 201380 201572 201626 202171 202267 202302 202318 202383 202388 202425 202481 202685 202972 203120 203346 203959 203999 204057 204428 204487 204490 204502 204552 205083 205124 205663 205835 205911 206017 206068 206371 206728 207084 207088 207566 208046 208198 208312 208485 209121 209605 209737 210240 210530 210644 210756 210848 210919 210950 211121 211199 211238 211619 211673 211720 211762 211849 211922 212283 212448 212651 212867 213058 213257 213354 213371 213373 213389 213438 213511 213676 213828 213889 213921 213945 213992 214018 214059 214196 214231 214295 214318 214351 214472 214497 214746 214799 214820 214860 214927 214940 214943 215117 215127 215176 215310 215376 215420 215436 215460 215462 215476 215479 215720 215766 215789 215826 215930 216240 216246 266724 327814 327837 328095 328958 329325 395111 398638 398741 398770 399979 400018 400171 400506 400992 401109 401110 401115 401116 401120} and not cf.client.bot and not http.user_agent contains "Bot" and not http.user_agent contains "Spider" and not http.user_agent contains "bot" and not http.user_agent contains "spider")