网站 CDN 遭遇恶意访问后的处理全记录

王 茂南 2025年4月11日07:21:06
评论
1 3279字阅读10分55秒
摘要这篇博客聚焦博主个人网站在七牛云存储遭遇的恶意访问事件,从发现问题到解决问题,详细记录了全过程。这篇文章分享网站 CDN 恶意访问处理经验,涵盖从紧急设置 IP 地址黑名单,到深度处理频繁访问文件,再到强化防护设置 referer 防盗链和设置单个 IP 的访问频率的完整解决流程。

简介​

最近,我在运营个人网站时遇到了一件糟心事。我的七牛云存储被恶意访问,同一个文件被访问量高达 200+GB,这突如其来的状况直接让我的账户欠费了。可以看到下图中,第一个链接占用了 97% 的流量占比,两天就直接让我欠费了。

网站 CDN 遭遇恶意访问后的处理全记录

为了解决这个问题,我花费了不少时间和精力去探索解决方案,现在就来和大家分享一下我的处理过程。下面主要会介绍以下几个步骤:(1)禁用 IP;(2)修改原始链接;(3)设置防盗链;(4)单个 IP 每秒访问的频率限制;(5)关闭欠费保护;

其他类似事件:七牛流量被盗刷后!。七牛云客服团队现在可以给出非常及时的反馈和解决方法,非常的好。提交的工单基本上半小时内(甚至更快)。非常感谢七牛云的团队。

 

​处理方法记录

发现恶意访问后的紧急举措:设置 IP 地址黑名单

当我察觉到账户欠费异常,经过一番排查,确定是 CDN 存储被恶意访问。在发现的第一时间,我决定设置 IP 地址黑名单。这是由于在后台可以很清晰的看到相同的 IP 访问了大量的流量

在 CDN 控制台进行操作,具体路径为:「CDN - 统计分析 - 日志分析」,进入日志分析的 TOP URL/IP 板块,在这里可以清晰地看到访问量最多的 IP。

如果发现的是单个 IP,直接将其添加到黑名单即可。要是遇到恶意访问来自某个网段的情况,也不用担心,我们可以通过特定格式 “xxx.xxx.xxx.0/24” 进行设置,其中 “xxx.xxx.xxx” 代表具体的网段地址,这样就能将整个网段纳入黑名单范围,有效阻止来自该网段的恶意访问。

关于 IP 黑名单的设置,可以参考链接,七牛云-IP黑白名单

 

针对频繁访问文件的深度处理:文件改名及链接替换

频繁访问文件改名​

在设置完 IP 地址黑名单后,我进一步分析发现大量访问都集中在同一个文件上。为了从根本上杜绝针对该文件的恶意访问,我采取了以下措施。

首先,对原始文件进行改名操作。这一步看似简单,实则关键,因为改名后,恶意访问者之前获取的文件链接就失效了。改名完成后,为了确保新的文件名能够及时生效,需要刷新缓存,让 CDN 能够正确地识别和提供新命名的文件。

需要注意的是,在七牛云上修改文件名之后,需要刷新缓存。使用下面的链接,刷新缓存。此时在访问原始的图片链接,则会出现下面的报错:

{"error":"Document not found"}

如果出现上面的报错,则说明原始的链接就失效了。

 

文章链接修改​

同时,由于我的博客中多处使用了该文件的链接,如果只改名而不替换博客中的链接,会导致博客中相关内容无法正常显示。所以,我需要查找并替换了博客中所有使用该链接的内容,保证了博客的正常访问和展示。下面是详细的步骤:

登录并选择数据库

首先,要通过 SSH 登录到 Linux 服务器,接着使用以下命令登录 MySQL 数据库:

  1. mysql -u your_username -p

​登录到 MySQL 后,需要选择 WordPress 所使用的数据库。你可以借助以下命令查看所有数据库:

  1. SHOW DATABASES;

然后,使用下面的命令选择 WordPress 数据库,需要将 your_wordpress_database 替换为实际的 WordPress 数据库名:

  1. USE your_wordpress_database;

如果希望查看某个表的完整字段信息,可以使用 DESC 命令,如下所示:

  1. DESC your_table;

 

查询包含原始链接的文章

这里我们以将  url1 替换为 url2 为例。在 WordPress 里,文章内容通常存于 wp_posts 表的 post_content 字段中。你可以使用如下 SQL 查询语句找出包含 url1 的文章:

  1. SELECT ID, post_title
  2. FROM wp_posts
  3. WHERE post_content LIKE '%url1%';

这时我们会看到查询到很多包含该链接的文章,我们可以进入查到的文章检查是否都用到了指定的链接内容。接下来就开始替换链接。

 

替换原始文章的链接

使用以下 SQL 更新语句把文章中的 url1 替换成 url2

  1. UPDATE wp_posts
  2. SET post_content = REPLACE(post_content, 'url1', 'url2')
  3. WHERE post_content LIKE '%url1%';

请将 url1 和 url2 替换成你实际要替换的 URL。执行此语句后,所有文章中的 url1 都会被替换为 url2

 

再次检查是否替换成功

可以再次运行之前的查询语句,确认是否还有文章包含 url1

  1. SELECT ID, post_title, post_content
  2. FROM wp_posts
  3. WHERE post_content LIKE '%url1%';

若查询结果为空,就表明所有文章中的 url1 都已成功替换为 url2。完成所有操作后,使用以下命令退出 MySQL:

  1. EXIT;

 

 

强化防护:设置 referer 防盗链

在完成前面两步操作后,我意识到为了防止类似的恶意访问再次发生,以及避免博客中的图片等文件被其他网站直接盗用,有必要设置 referer 防盗链。

 

referer 防盗链解释​

referer 防盗链的原理是通过检查请求来源的 referer 字段,判断该请求是否来自于我们信任的网站。如果请求来源不是我们设定的合法 referer,CDN 将拒绝提供文件访问服务。下面通过一个例子来解释:

假设你有一个个人网站,上面有很多精美的图片,你希望只有自己网站的用户能够访问这些图片。然而,有另一个网站(恶意网站)未经你的允许,直接在他们的网页中使用了指向你网站图片的链接,这样他们网站的用户在访问这些图片时,实际上是从你的服务器获取图片资源,消耗的是你的服务器带宽,这就是盗链。

例如,你的网站是example.com,有一张图片的地址是example.com/images/picture.jpg,恶意网站在其页面中使用了<img src="http://www.example.com/images/picture.jpg">;这样的代码来显示你的图片,而不自己存储图片,这就是典型的盗链行为。我们需要预防这种行为。

例如对于本网站来说,访问网站加载的图片可以在请求中看到对应的 referer。我们就是希望只有本网站可以正常加载图片:

网站 CDN 遭遇恶意访问后的处理全记录

 

​七牛云设置 referer 防盗链

在 CDN 控制台中,同样可以找到设置 referer 防盗链的相关选项。在这里,我们可以设置允许访问的 referer 列表,例如只允许自己博客的域名或者特定的子域名进行访问。这样一来,其他未经授权的网站就无法直接盗用我们博客中的文件,大大增强了网站内容的安全性。

关于 referer 防盗链的设置,可以参考以下的链接,设置Referer防盗链

 

限制单个 IP 访问的频率(目前不再支持)

这个也是从别人的博客里面看到的,网站安全-图床的防护和优化。该设置很有用,甚至可以说是防止被刷流量的核心操作。

单 IP 访问阈值,就是限制每秒多少次请求,这个需要根据你的网站以及资源情况进行设置,例如平均每篇博客 15 张图片,那么就可以设置成 15。也可以设置的少一些,例如 10。这个设置没法直接设置,需要提交工单找工程师进行设置(目前我问了客服,客服说不再支持)。

 

关闭欠费保护期

七牛云存在「欠费保护期」,也就是欠费之后服务不会停止,可以有三天的时间服务继续。这样的好处就是一些重要业务不会下线。但是对于小网站来说,欠费的时候,特别是遇到恶意刷流量就下线就行。

一旦关闭欠费保护期之后,如果欠费了所有服务就全部停止。意味着就无法访问图片了。然后我们会有充足的时间设置「禁用 IP」,禁用完毕之后再充值恢复网站的访问。

关闭欠费保护期也不能手动关闭,需要开一个工单,然后会有客服打电话给你确认是否要关闭欠费保护期,就确认即可。

 

总结​

通过以上一系列的操作,我成功解决了网站 CDN 被恶意访问的问题,不仅阻止了恶意流量,还加强了网站的整体防护能力。希望我的这段经历能够为其他站长提供一些参考和帮助,在遇到类似问题时能够快速有效地应对。

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2025年4月11日07:21:06
  • 转载请务必保留本文链接:https://mathpretty.com/19569.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: