最近由於一些原因,被要求爬取了十幾個行業平臺的資料,從使用者資訊到釋出訂單資訊,從網站到小程式及APP。這些平臺有些一點反爬意識也沒有,可以隨隨便便從介面拉取資料,有些反爬形同虛設,還有些網站反爬做得很完善。
自己辛辛苦苦寫好的程式,逐漸發展了一些使用者,結果上升期被不正當競爭者趁虛而入,這是既無奈又可悲的。雖然筆者在扮演“進攻者”的角色,在這個過程中也積累了些經驗,關於爬取的部分前不久寫了一點基礎教程;這篇文章則正好相反,記錄下別人的反爬策略,講一講基本的反爬和防護,希望大家能保護好自己的介面,免受不正當競爭者的攻擊。
平臺一:百姓網
百姓網作為老牌的資訊釋出平臺,有很大的使用者基數和資訊釋出量,業務從網站到APP,覆蓋的範圍很廣。正因為它有網頁端,爬取資料變得極為簡單。爬取的目標是在某些板塊釋出的釋出人資訊,重點是手機號。
在簡單分析頁面後,抓了Cookie,輕鬆地抓去了頁面資料,因為要處理頁面的dom,選擇用node寫爬蟲,cheerio解析資料後存到mongo裡。
雖然百姓網對於爬蟲幾乎不設防,但對ddos還是有所防範的。當爬蟲連續訪問時很容易觸發安全防護,所有請求被強制重定向到驗證頁面,完成九宮格驗證才允許繼續訪問。這個問題在合理調整爬取速度後很少發生,這道防護算是沒有起到任何用處。
平臺二:某行業權威小程式(JZG)- 鬥智鬥勇成功爬取一段時間後被斬斷爬取機會
這個小程式平臺是由行業內有影響力的人發起的,上邊釋出的資訊幾乎都是第一手的。平臺的操作流程是這樣的:可以任意檢視資訊,但是釋出聯絡人的手機號是隱藏的,如果想檢視必須要消耗積分。積分可以通過分享獲得,但是沒有提供購買積分的入口。
在分析了資料後基本確定可以做,這個時候積分還是可以通過分享無限次獲取的,但估計會很快被封掉,因為在研究的時候發現這個平臺經常因為更新版本十幾分鐘不可用(保守講,可能實際時間更長),說明還是有人在維護的,後端是java寫的,因為有次報錯把堆疊漏出來了。因為是要實時同步釋出資訊,所以選擇用Guzzle拿到資料以後呼叫以後的釋出方法來直接儲存。
這個平臺還有一個防護機制,介面呼叫頻率過高後會被遮蔽IP,在除錯開發時忘記掛的是自己的外網代理,被拉黑IP,後換回公司網後又不小心被拉黑。最後為了能拉取資料,專門買了個動態ip的服務,當然也是為了線上可以穩定執行。具體的方法可以自行搜尋Guzzle的文件,這裡不多餘講了。
這樣平穩執行一段時間後又不行了,把老闆急的大半夜送了一部iphone過來(不要問我為啥一定要iphone,以前寫過)。雖然不情願但是還得繼續搞,扒介面發現介面地址變了,再查新介面發現介面引數變了,把所有都調對後試執行——積分不足。原本無限次獲取積分的分享介面已經被限死只生效一次。所有人積分被重置為20,小程式還加了積分流水的展示頁,大概是被察覺然後升級系統了。這個平臺還沒開放購買積分,最終GG。
平臺三四:JZYG / JZGRXXPT 等
前者是微擎二次開發的小程式平臺,按理微擎是預設支援介面簽名的,但是可能是開發者為了圖方便沒有用。檢視資訊需要積分,讓老闆買了幾百積分,輕鬆搞定。
後者基本沒有設防,資料也沒有隱藏,相應的資料質量也一般,輕鬆搞定。
爬失敗的平臺
JGJ / YPW
這兩個平臺也算行業內發展較快的平臺,既有小程式也有app。他們沒有爬成功都是因為介面做了簽名,
如果逆向的話可以挖出來簽名的key和簽名方法,我還只能爬介面扒資料,無奈作罷。
總結下幾個爬成功的和沒有爬成功的程式,給大家提供幾個基本的防護思路。
- 確保不暴露使用者密碼手機號等本不需要展示的資訊,使用Model $hidden或stub-api將相應資料白名單化。
- 做好一些無成本或低成本的防護,如介面簽名或介面加密(強烈推薦)。兩種方式都是通過金鑰難以逆向獲得的方式實現介面保護。通過中介軟體和interrupt可以輕鬆實現簽名或加解密。攔截像我這種不會逆向的人綽綽有餘。
- 建立危險使用者行為模型,在危險行為被識別出來後,增強驗證級別。如在簡訊驗證碼頻繁調取時強制要求補充驗證圖形驗證碼;或者使用者提交一些非法引數時增加行為驗證。
- 假定介面可以被破解,明確需要保護的敏感資訊並加以合適的保護。如手機號可以用虛擬號直接撥打,既保護資料又保護使用者隱私。
在現行的法律下,雖然可以維護權益,但往往因為案件價值和舉證困難導致難以維權。而做好基本防護卻可以攔截大部分非專業黑客,攻防的博弈背後是技術水平比拼和成本回報的衡量。祝大家能夠保護好自己的API免受不正當競爭。