怎么自己建立垂钓网站检测体系
0×01根本体系架构
跟着电子商务、互联网金融的快速开展,在利益的唆使下,从事“垂钓进犯”的黑产呈逐步上升趋势。“垂钓进犯”不仅对企业的品牌形象形成严峻危害,还对用户的账户安全、乃至资金安全构成了极大的要挟。
现在“垂钓进犯”现已为了网络诈骗的重要一环,因而反垂钓体系在电子商务、金融证券、电信运营商等企业的安全运营中起着越来越重要的位置。
反垂钓体系一般有如下两种架构。
关于这种架构首要适用于缺少终端控制力的企业。企业能够从各个途径搜集待检测的url,检测引擎调用运用WebKit引擎获取页面烘托后的有用内容,然后调用检测算法对页面内容进行检测。检测后将检测成果存至数据库,之后将检测成果输出至第三方的阻拦体系、关停服务提供商等,终究遏止“垂钓进犯”的发作。
关于第二种架构,适用于具有很多终端的企业,运用终端的才能替代了WebKit。终端直接将疑似页面的特征发回后端的检测引擎,检测引擎生成检测成果、产出黑名单,一起将检测成果的回来至终端。
0×02检测引擎
检测引擎做为反垂钓体系的中心承担着辨认页面是否为垂钓网站的使命。针对垂钓网站的检测手法首要有IP黑名单,url剖析,域名注册信息剖析,页面内容剖析,图像辨认等办法。
其间页面内容剖析一直是垂钓页面辨认的首要手法。页面辨认的首要算法有贝叶斯算法、机器学习算法、Html文档特征等算法。
下面介绍下怎么运用贝叶斯算法进行页面辨认。
贝叶斯算法简介
贝叶斯分类是一类分类算法的总称,是关于随机事情A和B的条件概率和边际概率的一则定理。
P(A)是A的先验概率或边际概率。之所以称为”先验”是因为它不考虑任何B方面的要素;
P(A|B)是已知B发作后A的条件概率,也因为得自B的取值而被称作A的后验概率;
P(B|A)是已知A发作后B的条件概率,也因为得自A的取值而被称作B的后验概率;
P(B)是B的先验概率或边际概率,也作标准化常量。
分类原理
咱们用W来代表一个待分类的网页,用h+垂钓网页,用h-代表正常网页。运用贝叶斯公式,断定页面是否为垂钓网页可描述为:
P(h+|W)=P(h+)*P(W|h+)/P(W)
P(h-|W)=P(h-)*P(W|h-)/P(W)
P(W)为常量,能够暂时疏忽。P(h+)、P(h-)为先验概率,即一个实在的网页调会集,垂钓网页的份额与正常网页的份额。
为了求得P(W|h),咱们能够将W进行分词,W={w1,w2,w3…}。假如咱们假定w1,w2等是条件无关的,则P(W|h+)=P(w1|h+)*P(w2|h+)*P(w3|h+)。
P(wi|h+)经过Laplacean滑润处理后,P(wi|h+)=(1 + 特征词wi在h+练习会集的词频) / (悉数特征词去重个数 + h+下一切词呈现总数)。
这样咱们便能计算出P(h+|W)与P(h-|W),比较巨细可知页面归于哪一分类。
数据预备
为了获取待检测域名,咱们能够从ICANN的Centralized Zone Data Service免费获取到全球的域名列表,做差量可得到全球的每日新增域名。之后将每日新增的域名导入到咱们的待检测列表。
咱们能够经过Python调用Phantomjs去获取页面中内容。
Phantomjs:
var webPage = require('webpage');
var system = require('system');
var page = webPage.create();
if (system.args.length === 1) {
console.log("error");
phantom.exit();
} else {
url = system.args[1];
page.open(url, function (status) {
if (status == 'success') {
var content = page.content;
console.log(content);
} else {
console.log("error");
}
phantom.exit();
});
};
Python:
def get_page_content(url):
cmd = 'phantomjs getPageContent.js %s' % (url)
stdout, stderr = subprocess.Popen(cmd, shell = True,
stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()
return stdout
为了得到一个贝叶斯分类器,需求一个样本集对其进行练习。首要要对页面做打标分类,一类为垂钓页面样本集,一类为正常页面样本集。样本集便是咱们的原始练习资料。
树立模型
这儿针对中文的垂钓页面树立分类模型,咱们先运用正则提取出原始页面中的中文字符。
def get_chinese_content(raw_page_content):
content_list = re.findall(ur"[u4e00-u9fa5]+", raw_page_content)
[1] [2] 黑客接单网