如何防止接口被爬虫或者其它人任意调用?

互联网企业来说,数据非常有价值,我们写的接口本来是给自己的应用和客户端调用的,但是却会被一些非法爬虫抓取数据谋利。因此这篇文章主要探讨如何一定程度上防止恶意调用和爬取。

接口有两种,一种是需要登录才可以调用的,一种是不需要登录就可以调用的。

对于需要登录才可以调用的,这种就可以根据用户来限制调用次数和频率,也就是单个用户一天可以调用多少次,或者每小时调用多少次,每分钟可以调用多少次。

举个例子,比如图片接口,正常登录用户来说。不会这么频繁下载图片,普通用户可能一天也就看那么几百张图片。

但是如果是爬虫恶意下载图片就不一定了,可能连续或者一整天都是从服务器里面拿图片,正常用户会这样子吗?哪个正常用户会一整天都在看图片?所以这种可以设置单用户每天的限制。

爬虫如果使用多个账号切换来下载,这时候根据账号来限制就不太好使了,爬虫如果没有用代理的话,如果用自己的服务器来爬数据,那么非常好禁止,只需要根据ip来限制就可以了。

还是那个思路,一般用户单天会调用多少次接口,以及每分钟的频率,如果超过了次数,明显不正常,那么就可以直接根据ip封禁即可。

如果爬虫是使用了代理来爬,那么就很难根据ip,用户账号来封禁,因为代理的ip是变化的。

这时候可以从接口调用的技术面来限制,加强接口的调用逻辑,比如接口调用需要哈希算法,这个哈希算法有个关键的参数在客户端。

这样子就需要反编译客户端才知道具体的参数是什么了,这无疑加大了难度。

或者在客户端内置一些特殊的算法,接口需要附加特殊算法计算出来的参数才可以调用成功。

举个例子:

有如下接口/getpic?username=xiaoli

这个接口的意思是获取小李用户的图片。如果不做加密,那么任何爬虫很简单就可以获取任意用户的图片,只需要附加参数即可。

但是如果改成如下才可以获取就不一样了

/getpic?username=xiaoli&timestamp=xxxx&hash=xxxx

关键是这个hash函数,举个简单的例子md5(username+timestamp+key)

然后这个key是隐藏在客户端的,只能反编译你的客户端获取,为什么要加timestamp,你不加timestamp那么每次访问只要是相同用户名hash都是一样的,爬虫轻而易举就知道那个hash后的固定字符串是什么了。

但是这些对于擅长逆向反编译高手来说这些依旧难不倒他们。

所谓道高一尺魔高一丈。

但是这样的高手毕竟是少数,如果做到上面这些,也可以挡住一大部分的非法爬虫工具了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容