爬蟲,網絡安全最大的威脅之一!
根據爬取數據類型而分,爬蟲有不少種類,比如爬取Email地址的、爬取商品價格的、爬取圖片的,而最多的是爬取內容的,內容數據爬蟲是為泛濫的!
爬蟲讓很多人對其深感苦惱,今天將用Node.JS實現一種防護性能很強的反爬蟲系統。
首先展示防護效果,然後付上完整代碼,以了解實現方法。
防護效果展示
根據兩個核心思路進行效果展示如下:
1、字體加密
創建自定義字體庫,將字體進行加密。
舉一個最直白的例子:
比如要在網頁中顯示文字:「我是我,你是你,她是她」,在正常的情況下,網頁中就是存在這幾個字,爬蟲當然可以爬取。
我們要實現的效果是,讓這幾個字不存在,網頁源碼中可能是:
但是在網頁中可以正常顯示:
但是卻不可複製,複製後,全部或部分內容將不能正常顯示:
2、字體防破解
單純的字體加密,是不太難被破解的,因為上述的「密文亂碼符號」,其實也就是一種對應關係,例如:「A」對應「啊」,「B」對應「不」。只要獲得足夠的對應關係,替換就可以破解還原出原內容。
具體實施時,可以從網頁中獲取字體文件。
如TTF,通過格式轉換,化為TTX,即可得到對應關係。
也可以手動記錄對應關係。
那麼對於這兩種破解,我們也需要進行防護。
1、防止字體文件被下載;
動態字體路徑:
注意以下兩圖,不同的字體路徑:
即:每次訪問都是不同的字體路徑,而且,此動態路徑文件是不可下載的:
當然,文件的正常使用是不受影響的。
2、使用動態對應關係,防止字體對應被獲取。
我們內置一套系統,自動或手動實現編碼變化:
以下兩圖,兩種不同的編碼展示,前面部分是編碼,後面是對應的字:
源碼展示
實現以上功能的代碼並不複雜,本例由兩個文件,一個目錄組成:
acs.js是主文件,內容如下:
/**
* 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;i++){
//新的unicode
key=""+i;
//unicode對應的字
value=words[i];
//字形
word=font_transfer.getGlyph(words[i]);
//加入到新字體中
font.setGlyph(key,word);
//輸出信息
result[key]=value;
}
//輸出各種字體文件
font.output({
path:new_ttf
})
//返回值
return result;
}
/**
* express web
*/
var express = require('express');
var app = express();
app.use(body_parser.urlencoded({extended: true}));
var port = 8000;
var verstion = "0.0.1";
app.listen(port);
console.log("anti content splider");
console.log("v",verstion);
console.log("server at port:",port);
console.log("auther:","wangliwen");
console.log("copyleft","http://www.sharewaf.com");
//變型url特徵池,存放要保護的ttf路徑,使ttf路徑不洩露
var transform_url = [];
//express中間件
app.use(function(req,res,next){
console.log(req.url,req.method);
if(req.method.toString().toLowerCase() == "get"){
//只處理get請求
//url
var url = req.url;
//首頁訪問
if(url == "/"){
url = "./admin/index.html"
}else{
url = "./admin" + url;
}
//變形url池
console.log(transform_url);
//把變形的url路徑還原回去
for(var i=0; i<transform_url.length; i++){
//當前url,是否包含有變形池中的某條特徵內容
if(url.indexOf(transfor
代碼中已有詳細注釋。
config.js是字體編碼與文字對應關係,源碼中稱為「變碼距陣」,內容如下:
exports.tramsform_matrix={"":"我","":"你","":"他","":"只","":"保","":"碼","":"用","":"。"}
註:當進行動態變碼操作時,此文件內容會發生變化。
admin目錄下,是幾個靜態網頁文件:
index.html內容如下:
<html>
<head>
<meta charset="utf8">
<title>anti content splider</title>
</head>
<body>
<form method="post" action="/transform_ttf" target="_blank">
原始字體:<input id="font_src" name="font_src" type="text" value="KaiGenGothicSC-Normal.ttf" /><br>
變碼字體:<input id="font_dest" name="font_dest" type="text" value="font1" /><br>
變碼文字:<input id="transform_words" name="transform_words" type="text" value="我,你,他,只,保,碼,用" /><br>
<br>
<input type="submit" value="Transform!"/>
</form>
</body>
</html>
test.html是用於測試,展示變碼效果的文件,內容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>字體測試</title>
</head>
<body>
<div>
<style>
@font-face {
font-family: "font1";
src: url("font_dest/font1.eot"); /* IE9 */
src: url("font_dest/font1.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */
url("font_dest/font1.woff2") format("woff2"),
url("font_dest/font1.woff") format("woff"),
url("font_dest/font1.ttf") format("truetype"), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
url("font_dest/font1.svg#iconfont"); /* iOS 4.1- */
}
.font-1{
font-family:"font1";font-size:16px;font-style:normal;
}
</style>
<div>是,是,是,她是她</div>
<div>ShareWAF(sharewaf.com)不是WAF!</div>
<div>JS代護?混淆?加密,當然JShaman(jshaman.com)!</div>
</div>
</body>
</html>
以上,是完整的動態字體變碼加密反爬蟲方案,出自於ShareWAF,與ShareWAF運營的商業反爬蟲產品:ShareWAF-ACS,原理甚本一至。由此可知,本文是相當有價值的技術資料。