爬蟲,網絡安全最大的威脅之一!
根據爬取數據類型而分,爬蟲有不少種類,比如爬取Email地址的、爬取商品價格的、爬取圖片的,而最多的是爬取內容的,內容數據爬蟲是為氾濫的!
爬蟲讓很多人對其深感苦惱,今天將實現一種防護性能很強的反爬蟲系統。
首先展示防護效果,然後付上完整代碼,以瞭解實現方法。
防護效果展示
根據兩個核心思路進行效果展示如下:
1、字體加密
創建自定義字體庫,將字體進行加密。
舉一個最直白的例子:
比如要在網頁中顯示文字:“我是我,你是你,她是她”,在正常的情況下,網頁中就是存在這幾個字,爬蟲當然可以爬取。
我們要實現的效果是,讓這幾個字不存在,網頁源碼中可能是:
但是在網頁中可以正常顯示:
但是卻不可複製,複製後,全部或部分內容將不能正常顯示:
2、字體防破解
單純的字體加密,是不太難被破解的,因為上述的“密文亂碼符號”,其實也就是一種對應關係,例如:“A”對應“啊”,“B”對應“不”。只要獲得足夠的對應關係,替換就可以破解還原出原內容。
具體實施時,可以從網頁中獲取字體文件。
如TTF,通過格式轉換,化為TTX,即可得到對應關係。
也可以手動記錄對應關係。
那麼對於這兩種破解,我們也需要進行防護。
1、防止字體文件被下載;
動態字體路徑:
注意以下兩圖,不同的字體路徑:
即:每次訪問都是不同的字體路徑,而且,此動態路徑文件是不可下載的:
當然,文件的正常使用是不受影響的。
2、使用動態對應關係,防止字體對應被獲取。
我們內置一套系統,自動或手動實現編碼變化:
以下兩圖,兩種不同的編碼展示,前面部分是編碼,後面是對應的字:
源碼展示
實現以上功能的代碼並不複雜,本例由兩個文件,一個目錄組成:
acs.js是主文件,內容如下:
<code>/** * Anti Content Splider * Auther:WangLiwen * www.ShareWAF.com */var fs = require('fs')var font_carrier = require("font-carrier")var body_parser = require("body-parser")var mime = require("mime");//變碼矩陣,存放字和unicode的對應關係var transfer_result = require("./config").tramsform_matrix;/** * TTF變碼 * 基於一種字體,生成另一種新字體 * 參數:ttf,原始字體 * 參數:words,要變碼的字 * 參數:new_ttf,新的字體 * 返回值:新字體中,unicode和字的對應關係 */function transform_ttf(ttf,words,new_ttf){ //創建新的空字體 var font = font_carrier.create() //從ttf字體中獲取文字 var font_transfer = font_carrier.transfer(ttf) if(words.length==0){ return{}; } var result={}; var key,value,word; //遍歷傳入的參數:要變碼的字體 for(var i=0;i<words.length> 100){ res.end("oooops"); return; } //還原路徑 url = url.replace(new RegExp(transform_url[i],"g"), "font_dest"); console.log("before:",transform_url) //刪除使用過的時間變量 delete transform_url[i]; transform_url.splice(i,1); console.log("after:",transform_url) } } //真實地址 console.log("really url:",url); //讀取文件內容 var file_content = fs.readFileSync(url) //測試html文件 if(url.indexOf("/test.html") !=- 1){ //如果是此html文件,則對文件中的原始字體路徑做保護 //網頁源碼 file_content = file_content.toString(); //遍歷變碼矩陣,對網頁中的文字進行變碼 for (var index in transfer_result){ console.log(index,transfer_result[index]); //正則全局替換 file_content = file_content.replace(new RegExp(transfer_result[index],"g"), index+";"); } var count = (file_content.split('font_dest')).length - 1; console.log("replaced:",count); //以時間做為參照值 var time_parm = (new Date).getTime(); //字體路徑保護,將正確路徑font_dest替換為時間值 file_content = file_content.replace(new RegExp("font_dest","g"), time_parm); //存入變型url特徵池 for(var i=0; i<count>/<words.length>/<code>
代碼中已有詳細註釋。
config.js是字體編碼與文字對應關係,源碼中稱為“變碼距陣”,內容如下:
<code>exports.tramsform_matrix={"Ԕ":"我","ԕ":"你","Ԗ":"他","ԗ":"只","Ԙ":"保","ԙ":"碼","Ԛ":"用","ԛ":"。"}/<code>
注:當進行動態變碼操作時,此文件內容會發生變化。
admin目錄下,是幾個靜態網頁文件:
index.html內容如下:
<code> <title>anti content splider/<title> /<code>
test.html是用於測試,展示變碼效果的文件,內容如下:
<code><title>字體測試/<title>/<code>Ԕ是Ԕ,ԕ是ԕ,Ԗ是Ԗ,她是她ԛShareWAF(sharewaf.com)不ԗ是WAF!JS代ԙԘ護?混淆?加密,當然ԚJShaman(jshaman.com)!
以上,是完整的動態字體變碼加密反爬蟲方案,出自於ShareWAF,與ShareWAF運營的商業反爬蟲產品:ShareWAF-ACS,原理甚本一至。由此可知,本文是相當有價值的技術資料。
閱讀更多 小咕嚕wing 的文章