大家好,我是程序员鱼皮。昨天逮到一个爬取我们 程序员面试刷题网站 - 面试鸭 的题目的用户,小伙子可能自以为很聪明,实际上手法非常拙劣!我一分钟不到就把他揪出来了。
下面聊一聊我是怎么做的,也借这个事情,给大家分享一下如何快速定位爬虫和攻击者的方法。
如何纠出攻击者?
发现猫腻
生活中有人偷了你的东西,肯定要看监控。抓爬虫用户也是一样,先看监控。
像我是怎么发现网站被爬了呢?首先我们系统内部有一套识别爬虫的策略,其次我们每天都会关注网站的流量情况,有些异常情况一眼便可看出。
比如这次事件当天,我先通过系统云服务的监控看了下近 6 个小时向我们发送请求的客户端 IP,除去第一个是我们自己的 IP 外,其他几个 IP 的请求数都远超我们的业务平均值,显然这些 IP 不对劲!
那这些 IP 都在请求什么资源呢?通过监控查看 URL 路径访问排行,发现获取题目信息的接口被调用了 10 万多次!
然后我就根据这个路径进行筛选,查看访问它的客户端 IP 排行,除去第一个是我们自己的 IP 外,第二个 IP 的请求数显然有问题!
然后根据这个 IP 进行筛选,分析他的请求情况:
看到这个请求图,一眼就知道是爬虫了!我反正不信有正常用户半夜连续刷题 6 个多小时,你见过凌晨四点的面试鸭么?
看到这个 “纵享丝滑” 的曲线,我有点哭笑不得。虽然小伙子应该是在爬取的时候加了一些随机数导致每分钟的请求有一些细微的区别,但在监控面前,显得过于拙劣了。
识别爬虫的基本方法,就是看爬虫的特征、请求频率和模式。 哪怕你自以为很聪明,每天只爬一点题目,只要筛选系统一段时间的访问情况、或者用系统自动分析一波访问记录,是否为正常用户还是一目了然。
不过其实我有点小感动的,选择在半夜这个时间段下手,你人还怪好哩,这是不想给我们系统施加压力吧。
找到真凶
发现这个 IP 不对劲后,怎么知道他是我们面试鸭的哪个用户呢?
当然是看日志了!开发线上系统,肯定要有 IP 访问请求的日志记录。我直接在业务服务器的日志中根据 IP 和时间段进行筛选,就看到了该用户发送的请求和参数,什么时间访问了哪道题目都很清楚:
这个时候,再去业务系统里看下是哪个 id 的用户在这些时间段访问了这些题目,就能查出来了。
还有一种方法,他想要获取到题目信息,一定要先登录,在日志中搜索该 IP 请求 “登录接口” 或者 “获取登录用户信息接口” 的记录,查看接口的返回值,就知道是哪个用户了。
豁,竟然还是个永久会员用户!何必呢?
通过本次事件,再给大家一些系统开发时的建议:
- 一定要做好请求的日志记录,不要嫌麻烦、不要嫌占用空间,关键时刻它是帮你定位业务异常的核心线索。
- 要对请求经过的每个环节(比如 CDN、网关、业务服务器)进行监控,如果没有监控,除了问题时你会毫无头绪,只能从海量日志中去大海捞针找线索。一般第三方云服务的监控都比较成熟,直接接入就好了。
- 要养成看监控的习惯,不是说系统挂了才要看监控,很多潜在的风险只有通过监控(或者告警)才能发现。
- 可以给获取重要数据的接口增加更多的信息记录,最好跟系统的某个用户关联起来,便于定位非法用户。
最后,弱弱地呼吁一下,不要再爬我们的刷题网站了,本来小程序和网页端就都是支持刷题的,很快我们还会上线 IDEA 摸鱼刷题插件,尽力保证大家的刷题体验!