小花说:本文还没有完全写好,但不管了就先发出来了,实在没精力花太多时间在码字上,如果感兴趣的朋友可以 Bookmark 一下,在接下来的几天里还会持续润色更新添加配图等。

当你的网站流量达到一定程度后,有些坏东西就一定会找上门来,谁都逃不掉。最近在网站流量没有显著增加的情况下,服务器压力暴增,CPU和磁盘负荷都快达到极限了。花了点时间找原因,发现主要就是各种恶意程序和资源盗链造成的,下面就分享一下如何利用 Cloudflare 把这些烦人的东西阻挡在服务器之外。

在网站的运营中,除了DDOS、注入、后门这些对网站生死危关的威胁,对服务器影响最大的就是一些消耗服务器资源,但不会给你带来任何收益的垃圾访问,本文讨论的就是后者,我把这些垃圾访问分为三大类:

1、恶意蜘蛛:蜘蛛又叫爬虫(Crawl),是一种在网络上爬行抓取网页和图片等资源并为己所用的自动程序。大部分蜘蛛被搜索引擎用于搜集网页信息并建立索引,如 Google、Baidu、Bing 都有自己的蜘蛛,也有一些蜘蛛被用作其他商业目的,比如做 SEO 分析的 Semrush、做人工智能语料搜集的 ChatGPT。蜘蛛有好有坏,好蜘蛛要大力欢迎,甚至要根据规则迎合它,因为它们能给我带来实实在在的流量,而坏蜘蛛对我们一点用都没,消耗服务器资源又不能带来流量,有些流氓蜘蛛还不遵守 robots.txt 协议肆意乱爬,甚至设置极高的访问频率让你的服务器濒临当机,说的就是你,字节跳动;

2、采集:和蜘蛛有点像,也是利用程序自动访问你的网站并获取数据为己所用。采集和蜘蛛最大的区别在于第一是目的,采集的目的是为了获取你的数据或资源,从而建立你的竞品网站,而蜘蛛则是为了其他商业目的;第二是在行为上,再坏的坏蜘蛛至少也是正规公司运营的,总归有那么一点底线,至少蜘蛛是不会隐藏自己身份的,而采集者则什么人都有,没底线的太多了,隐藏身份是基本操作,稍微好一点的会懂得细水长流不要对你的服务器造成太大影响,恶劣的则开几十上百个线程同时采,至于你的服务器会不会受不了,不是他关心的内容;

3、资源盗链:就是把你网站的图片、视频等媒体资源直接在其他网站展示播放,服务器资源的成本是你的,而收益跟你毫无关系。同样,也并非所有盗链都是有害的,如果对方网站在引用你图片的同时能加上一条说明:图片资源来自于《xxx》并附上超链接,那我也可以当没看见这事,可惜运营到现在我就从来没看到过。

4、无授权下载:分析网页内容,获取其中图片、视频等媒体资源的地址,并使用网站程序、客户端等工具批量下载。这种通常都是普通用户的自发行为,通常偶发性较大,危害较小,因为普通用户通常只会尝试下载个别他们感兴趣的内容,下载完也就结束了。

因为采集和蜘蛛的行为比较接近,本文就先谈下如何利用 Cloudflare 防止恶意蜘蛛和采集,至于如何防止盗链和无授权下载以后有时间再写。

接下来的内容需要假设你是一个有一定运营经验的站长,知道 Cloudflare 是什么东西,并且会基本的操作。

首先把 Cloudflare 站点计划升级到 Pro 或以上,只有 Pro 及以上计划才有分析和防火墙的托管规则功能,而如果没有分析功能,你连对手是谁都发现不了,更别提怎么防御了。在发文时,Cloudflare 的 Pro 计划是25美元一个月,240美元一年,这笔投资是少不了的的;

然后开始分析流量,进入“分析和日志” -> “流量”,可以看到非常详细的统计数据:流量类型维度可选请求量、数据访问量、页面浏览量等,时间范围维度可选 30 分钟、6 小时、12 小时、24 小时等,而在分析结果中,又可以根据引用、路径、主机、浏览器、操作系统、用户 IP、HTTP Code 等进行进一步筛选,功能很强大,我们主要就是要分析这些数据,找出隐藏在其中的坏分子来;

坏蜘蛛是最容易发现和防御的,正如之前提到的,蜘蛛毕竟出自正规公司,不会像采集程序一般做贼一样的隐藏自己,几乎所有蜘蛛都会在源用户代理(User Agent)上加上自己的特定标识。防坏蜘蛛最简单的办法是到网上找一份坏蜘蛛列表,管它来没来过,先封了再说。不过列表的更新总不会那么及时,每天也都会有新蜘蛛出现,如果想靠自己找出坏蜘蛛们,那么看下下面的方法:

在流量分析中,分析类型选择“请求量”,筛选“边缘状态代码”为 200,只看成功调用的记录,筛选“源浏览器”为“Unknown”,只看未知浏览器的记录,显示记录数改为 15 条以方便观察,然后去观察“源用户代理”,看有哪些非常规的记录,逐一核实,好蜘蛛放过,不确定好坏的就 Google 查下或问下 ChatGPT,如果认定是坏蜘蛛就记录下它的 User Agent 的特定标志,比如 ChatGPT 蜘蛛的 User Agent 就是“Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.0; +https://openai.com/gptbot)”,“gptbot”就标明了它的身份,把“gptbot”记录下来,等会封禁时用;

在刚才寻找恶意蜘蛛的时候,你可能也已经发现了一些采集程序,因为如果不懂隐藏自己,采集程序常常也会在 User Agent 里留下一些特定的标记,比如 Curl 什么的,一样的也记录下来,不过数量不会太多,因为大部分商用和开源采集程序都懂得隐藏自己;

接下来就是要找出那些隐藏在茫茫人海中的流氓了,这时通过筛选未知源浏览器已经没意义了,因为他们表面看上去和普通用户没啥区别,靠 User Agent 封禁也是行不通的,对采集的主要办法是找出它们的 IP。

在流量分析中,分析类型选择“请求量”,筛选“边缘状态代码”为 200,显示记录数改为 15 条以便观察,添加筛选器,选择“源用户代理”,规则选择“不包含”,输入“google”,把谷歌蜘蛛排除在外(这是因为我站的谷歌蜘蛛来访次数很多,剔除掉看起来方便,根据自己站情况而定),然后看访问次数最多的 IP,逐一排查,可以单独筛选该 IP,先通过 IP 查询工具看下来自哪个地区,如果是属于某个数据中心的那要格外留意,如果是普通 IP 也不能排除可能,有些国家和地区是重灾区,比如中国、香港、德国、新加坡等,然后再通过它的来访时间、访问频率、访问了哪些路径、使用了哪些浏览器、X-Requested-With 标头、引用方等信息,来判断这是普通用户还是采集程序,这里更多的是需要靠经验了,每个人情况都不一样,要根据自己网站情况具体分析。要注意的是不一定访问多的就是蜘蛛,有可能是某个在你网站泡了一宿的重度沉迷用户,也可能是个机场 IP,所以要多分析,尽量不要误杀;

在判断一个 IP 是真人还是采集时,引用地址非常重要,真人用户在你的网站内浏览,通常都是从一个网页点击到另一个网页,前者就是后者的引用地址,可以被读取到,而采集程序在爬取网页时一般不会设置引用,如果看到某个 IP 的大部分访问在 Cloudflare 里记录的“引用方”都是“无(直接)”,那就要格外注意了,不过是否发送引用是可以被一些浏览器插件关闭的,所以不能单纯把“引用为空”当作判断不是真人的依据,否则会误杀。

没有开发能力的站长到这里就结束了,而有开发能力的则可以利用本地足迹更好的帮助判断 IP 是真人还是采集程序,基本思路是把所用用户的每次访问都在服务器本地数据库记录下来,利用采集程序一般不会去调用 js 这个特性,让通过浏览器访问的普通用户每次访问都去调用一个 js 来记录用户的访问足迹,比如在每个页面中尾部都加上<script src=”/footprint.php”></script>,而在 footprint.php 实现记录当前用户 IP、本次访问 URL、引用地址等信息,当排查可疑IP时,去查一下这个 IP 的 js 调用记录,就很容易判断出这是不是正常用户,比如在 Cloudflare 里记录特定时段内某 IP 有数千次页面访问,而在记录足迹里一条记录都没有,或者才几十条,那么该 IP 就很大可能是采集程序。

现在我们已经把需要封禁的 User Ageng 标志 和 IP 都找出来了,该让它们尝尝 403 的滋味了,进入 Cloudflare 的安全性 -> WAF(没写完,有空再写)。

一定有运维高手会对本文嗤之以鼻,这些东西服务器日志里都有,不需要依靠 Cloudflare 也能分析出来,封禁也完全可以在 .htaccess 或类似功能里实现。我只能说你说的我都知道,你说的也都对,你完全可以也来写一篇教大家,我一定来点赞。

如果你耐心的看完了本文,很容易就得出总结,蜘蛛好防,采集难缠,事实也确实如此,因为没底线的人是很难战胜的。比如我花10分钟就能写出一个采集程序,伪装成普通用户,设置看上去很正常的引用,随机的每隔几分钟来你的网站爬一次,甚至隔段时间再换个IP代理,因为访问量不大,又没有规律,你是不可能在海量的访问记录里把我找出来的,而且就算你找出来了,我换个 IP 又来了,但这不重要,因为我这样的爬虫对你的影响也很小,你要做的只是把最大的、最不讲武德的、技术能力最差的那些找出来,就可以了,网络安全本来就是道高一尺魔高一丈,没有一劳永逸的解决方案,只有时时刻刻的斗智斗勇。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注