|
一个Web会见记录的因素是较量牢靠的,每个部门(要领、路径、参数、HTTP头、Cookie等)都有较量好的布局化特点。因此可以把Web进攻辨认使命抽象为文天职类使命,并且这种思绪应用在了安详规模,若有监视的进攻辨认[1]、 XSS辨认[2] 等。文天职类使命中常用的向量化本领有词袋模子(Bag of Word,BOW)、TF-IDF模子、词向量化(word2vec)等,兜哥的文章[3]已经做了具体的讲授。
颠末对Web日记特点的说明,本文以为行使TF-IDF来对样本举办向量化结果更好。一是颠末尺度化后哀求参数的值仍会有很是多的也许性,这种环境下词袋模子天生的特性向量长度会很是大,并且没法紧缩;二是每个哀求中参数个数有大有小,绝大大都不高出10个,这个时辰词向量能表达的信息很是有限,并不能反应出参数value的非常性;三是TF-IDF可以表达出差异哀求统一参数的值是否更有特异性,尤其是IDF项。
举个例子, http://ip.taobao.com/ipSearch.html?ipAddr=8.8.8.8 是一个查询IP具体信息的页面(真实存在),在某一段时刻内收到了10000个哀求,个中9990个哀求中ipAddr参数值是切合xx.xx.xx.xx这个IP的名目标,通过0×2中提到的尺度化之后,也就是9990个哀求的ipAddr参数为n+.n+.n+.n+ (虽然这里做了简化,数字不必然为多位)。另外有10个哀求的ipAddr是形如alert('XSS')、'or '1' = '1之类的差异的进攻Payload。
颠末TF-IDF向量化后,那9900个哀求ipAddr=n+.n+.n+.n+这一项的TF-IDF值:
- TF-IDF normal = TF * IDF = 1 * log(10000/(9990+1)) = 0.001
而呈现ipAddr=alert('XSS')的哀求的TF-IDF值:
- TF-IDF abnormal = TF * IDF = 1 * log(10000/(1+1)) = 8.517
可以看出非常哀求参数value的TF-IDF是宏大于正常哀求的,因此TF-IDF可以很好地反应出参数value的非常水平。
认识TF-IDF的同窗必然有疑问了,你这TF-IDF的字典也会很大呀,假如样本量很大并且有各式百般的参数value,你的特性向量岂不是稀少得不可了?对付这个题目,我有一个办理方案,也就是将全部的TF-IDF进一步加以处理赏罚,对参数key沟通的TF-IDF项举办求和。设参数key荟萃为K={k1, k2, …, kn},TF-IDF字典为荟萃x={x1, x2, …, xm}。则每个参数key的特性值为:
- vn = ∑TF-IDFxn xn∈{x | x startswith ‘kn=’}
详细代码在vectorize/vectorizer.py中:
- for path, strs in path_buckets.items():
- if not strs:
- continue
- vectorizer = TfidfVectorizer(analyzer='word', token_pattern=r"(?u)bSS+b")
- try:
- tfidf = vectorizer.fit_transform(strs)
- #putting same key's indices together
- paramindex = {}
- for kv, index in vectorizer.vocabulary.items():
- k = kv.split('=')[0]
- if k in param_index.keys():
- param_index[k].append(index)
- else:
- param_index[k] = [index]
- #shrinking tfidf vectors
- tfidf_vectors = []
- for vector in tfidf.toarray():
- v = []
- for param, index in param_index.items():
- v.append(np.sum(vector[index]))
- tfidf_vectors.append(v)
- #other features
- other_vectors = []
- for str in strs:
- ov = []
- kvs = str.split(' ')[:-1]
- lengths = np.array(list(map(lambda x: len(x), kvs)))
- #param count
- ov.append(len(kvs))
- #mean kv length
- ov.append(np.mean(lengths))
- #max kv length
- ov.append(np.max(lengths))
- #min kv length
- ov.append(np.min(lengths))
- #kv length std
- ov.append(np.std(lengths))
- other_vectors.append(ov)
- tfidf_vectors = np.array(tfidf_vectors)
- other_vectors = np.array(other_vectors)
- vectors = np.concatenate((tfidf_vectors, other_vectors), axis=1)
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|