纠结要起个什么样的文章标题…这篇帖子不会写的太硬核,就是想稍微理一下我自己的思路。
最近看了入侵检测和钓鱼检测的论文。入侵检测给我的感觉是系统太大了,而且从199几年就开始用机器学习做了??我的天哪…加上听另外一个同学说这个方向都被做烂了,觉得很有道理。看了几天论文之后,在打算复现论文时候因为没有找到打标签的数据集,就顺理成章地先把这个方向放下了。草率如我:)
钓鱼网站/邮件检测没看多少,emm…不过至少这个方向应该是比入侵检测做的人少的…而且感觉上这个小一点,看论文里说应该是数据集是比较好找的,而且不会像入侵检测的数据集那么老,都是上个世纪的??
在Github
上找到一个仓库,是论文的复现(虽然那个论文质量不是很好?),就大概看了一下,简单复现了一下。
https://github.com/rohitnaik246/Malicious-Web-Content-Detection-Using-Machine-Learning
论文用了UCI
中的钓鱼网站数据集。数据集是以arff
的格式给出来的,在文件里介绍了涉及到的字段。
使用的分类器是随机森林。在数据集给出的特征中选择了部分(手动)。最后论文的结果是以Chrome
扩展的形式展现的。就是当用户访问一个网址时候,会通过扩展来检查一下,这个网址的特征是通过repo
中的feature_extraction.py
文件提取的。
整体思路很简单,因为没有真正用机器学习写过程序,所以就复现一下感受一波。
# test.py
import numpy
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
import joblib
lables = []
file = open("Training Dataset.arff").read()
data_list = file.split('\r\n')
data = numpy.array(data_list)
data1 = [i.split(',') for i in data]
data1 = data1[0 : -1] # ? what's the meaning? seems meaningless
for i in data1:
lables.append(i[30])
data1 = numpy.array(data1)
features = data1[:, :-1]
features = features[:, [0, 1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15, 16, 17, 22, 23, 24, 25, 27, 29]]
features = numpy.array(features).astype(numpy.float)
features_test = features[10000:]
lables_test = lables[10000:]
clf = joblib.load('random_forest.pkl')
whole = len(features_test)
i = 0
right_count = 0
pred = clf.predict(features_test)
print 'The accuracy is:', accuracy_score(lables_test, pred)
训练的代码和repo
里一样,测试的话就用了训练集中第10000
个数据后面的1000多个数据。测试结果96%
多的准确率。
@attribute having_IP_Address { -1,1 } --> 使用ip地址(可能是16进制表示的)而不是域名进行访问的url
@attribute URL_Length { 1,0,-1 } --> url的长度,该数据集认为url长度大于54则是钓鱼网站(因为太长可能是被用来隐藏真正的恶意部分)
@attribute Shortining_Service { 1,-1 } --> 是否使用了短网址服务,可以参考:https://www.jianshu.com/p/43eea66a2235
@attribute having_At_Symbol { 1,-1 } --> url中是否包含"@"(@字符前的所有内容都会被忽略,用以隐藏后面的真正恶意部分)
@attribute double_slash_redirecting { -1,1 } --> url中是否有"//",这个在浏览器中测试了一下并没有重定向
@attribute Prefix_Suffix { -1,1 } --> url的域名部分是否有"-"
@attribute having_Sub_Domain { -1,0,1 } --> 域名部分中"."的个数
@attribute SSLfinal_State { -1,1,0 } --> 是否使用了HTTPS
@attribute Domain_registeration_length { -1,1 } --> 域名注册时长
@attribute Favicon { 1,-1 } --> 是否从其他域名下引入图标
@attribute port { 1,-1 } --> 端口打开情况
@attribute HTTPS_token { -1,1 } --> url的域名部分是否包含"https"
@attribute Request_URL { 1,-1 } --> 请求其他域下url的比例
@attribute URL_of_Anchor { -1,0,1 } --> a标签的链接
@attribute Links_in_tags { 1,-1,0 } --> ,