互联网企业来说,数据非常有价值,我们写的接口本来是给自己的应用和客户端调用的,但是却会被一些非法爬虫抓取数据谋利。因此这篇文章主要探讨如何一定程度上防止恶意调用和爬取。
接口有两种,一种是需要登录才可以调用的,一种是不需要登录就可以调用的。
对于需要登录才可以调用的,这种就可以根据用户来限制调用次数和频率,也就是单个用户一天可以调用多少次,或者每小时调用多少次,每分钟可以调用多少次。
举个例子,比如图片接口,正常登录用户来说。不会这么频繁下载图片,普通用户可能一天也就看那么几百张图片。
但是如果是爬虫恶意下载图片就不一定了,可能连续或者一整天都是从服务器里面拿图片,正常用户会这样子吗?哪个正常用户会一整天都在看图片?所以这种可以设置单用户每天的限制。
爬虫如果使用多个账号切换来下载,这时候根据账号来限制就不太好使了,爬虫如果没有用代理的话,如果用自己的服务器来爬数据,那么非常好禁止,只需要根据ip来限制就可以了。
还是那个思路,一般用户单天会调用多少次接口,以及每分钟的频率,如果超过了次数,明显不正常,那么就可以直接根据ip封禁即可。
如果爬虫是使用了代理来爬,那么就很难根据ip,用户账号来封禁,因为代理的ip是变化的。
这时候可以从接口调用的技术面来限制,加强接口的调用逻辑,比如接口调用需要哈希算法,这个哈希算法有个关键的参数在客户端。
这样子就需要反编译客户端才知道具体的参数是什么了,这无疑加大了难度。
或者在客户端内置一些特殊的算法,接口需要附加特殊算法计算出来的参数才可以调用成功。
举个例子:
有如下接口/getpic?username=xiaoli
这个接口的意思是获取小李用户的图片。如果不做加密,那么任何爬虫很简单就可以获取任意用户的图片,只需要附加参数即可。
但是如果改成如下才可以获取就不一样了
/getpic?username=xiaoli×tamp=xxxx&hash=xxxx
关键是这个hash函数,举个简单的例子md5(username+timestamp+key)
然后这个key是隐藏在客户端的,只能反编译你的客户端获取,为什么要加timestamp,你不加timestamp那么每次访问只要是相同用户名hash都是一样的,爬虫轻而易举就知道那个hash后的固定字符串是什么了。
但是这些对于擅长逆向反编译高手来说这些依旧难不倒他们。
所谓道高一尺魔高一丈。
但是这样的高手毕竟是少数,如果做到上面这些,也可以挡住一大部分的非法爬虫工具了。