互聯(lián)網(wǎng)企業(yè)來說盼砍,數(shù)據(jù)非常有價(jià)值尘吗,我們寫的接口本來是給自己的應(yīng)用和客戶端調(diào)用的,但是卻會(huì)被一些非法爬蟲抓取數(shù)據(jù)謀利浇坐。因此這篇文章主要探討如何一定程度上防止惡意調(diào)用和爬取睬捶。
接口有兩種,一種是需要登錄才可以調(diào)用的近刘,一種是不需要登錄就可以調(diào)用的擒贸。
對(duì)于需要登錄才可以調(diào)用的臀晃,這種就可以根據(jù)用戶來限制調(diào)用次數(shù)和頻率,也就是單個(gè)用戶一天可以調(diào)用多少次酗宋,或者每小時(shí)調(diào)用多少次积仗,每分鐘可以調(diào)用多少次。
舉個(gè)例子蜕猫,比如圖片接口寂曹,正常登錄用戶來說。不會(huì)這么頻繁下載圖片回右,普通用戶可能一天也就看那么幾百張圖片隆圆。
但是如果是爬蟲惡意下載圖片就不一定了,可能連續(xù)或者一整天都是從服務(wù)器里面拿圖片翔烁,正常用戶會(huì)這樣子嗎渺氧?哪個(gè)正常用戶會(huì)一整天都在看圖片?所以這種可以設(shè)置單用戶每天的限制蹬屹。
爬蟲如果使用多個(gè)賬號(hào)切換來下載侣背,這時(shí)候根據(jù)賬號(hào)來限制就不太好使了,爬蟲如果沒有用代理的話慨默,如果用自己的服務(wù)器來爬數(shù)據(jù)贩耐,那么非常好禁止,只需要根據(jù)ip來限制就可以了厦取。
還是那個(gè)思路潮太,一般用戶單天會(huì)調(diào)用多少次接口,以及每分鐘的頻率虾攻,如果超過了次數(shù)铡买,明顯不正常,那么就可以直接根據(jù)ip封禁即可霎箍。
如果爬蟲是使用了代理來爬奇钞,那么就很難根據(jù)ip,用戶賬號(hào)來封禁漂坏,因?yàn)榇淼膇p是變化的蛇券。
這時(shí)候可以從接口調(diào)用的技術(shù)面來限制,加強(qiáng)接口的調(diào)用邏輯樊拓,比如接口調(diào)用需要哈希算法纠亚,這個(gè)哈希算法有個(gè)關(guān)鍵的參數(shù)在客戶端。
這樣子就需要反編譯客戶端才知道具體的參數(shù)是什么了筋夏,這無疑加大了難度蒂胞。
或者在客戶端內(nèi)置一些特殊的算法,接口需要附加特殊算法計(jì)算出來的參數(shù)才可以調(diào)用成功条篷。
舉個(gè)例子:
有如下接口/getpic?username=xiaoli
這個(gè)接口的意思是獲取小李用戶的圖片骗随。如果不做加密蛤织,那么任何爬蟲很簡單就可以獲取任意用戶的圖片,只需要附加參數(shù)即可鸿染。
但是如果改成如下才可以獲取就不一樣了
/getpic?username=xiaoli×tamp=xxxx&hash=xxxx
關(guān)鍵是這個(gè)hash函數(shù)指蚜,舉個(gè)簡單的例子md5(username+timestamp+key)
然后這個(gè)key是隱藏在客戶端的,只能反編譯你的客戶端獲取涨椒,為什么要加timestamp摊鸡,你不加timestamp那么每次訪問只要是相同用戶名hash都是一樣的,爬蟲輕而易舉就知道那個(gè)hash后的固定字符串是什么了蚕冬。
但是這些對(duì)于擅長逆向反編譯高手來說這些依舊難不倒他們免猾。
所謂道高一尺魔高一丈。
但是這樣的高手畢竟是少數(shù)囤热,如果做到上面這些猎提,也可以擋住一大部分的非法爬蟲工具了。