Fwaf短源码学习

Fwaf

Fwaf是GitHub上的一个机器学习Web恶意请求防火墙,代码比较简洁,思路也比较清晰,由于和自己的某个想法很契合,就稍作分析。

库的使用和特征化

Fwaf使用sklearn库训练样本集。
其中,使用TfidfVectorizer对字符串进行特征化。

TfidfVectorizer

  • TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与文本挖掘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,互联网上的搜索引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结果中出现的顺序。
  • TF: Term Frequency,用来衡量一个词在一个文档中的重要性

\[ TF(t)=\frac{n(character(i))}{n(character)} \]

  • IDF: 逆向文件频率,用于衡量一个词在大型语料库中的重要性

\[ ID(t) = log_e(\frac{numOfDocs}{numOfDocsWhichIncludeT}) \]

\[ TF-IDF = TF*IDF \] * TF-IDF指标根据一个事实:如果一个词在一个文档中出现越多,则它对于该文档影响越大;如果一个词在所有语料库中出现次数越多,则它越“大众化”。也就是一个单词如果越“独特”,在个体中又越“重要”,则它在学习任务中就越重要。

  • sklearn.feature_extraction.text.TfidfVectorizer:可以将文档转换成TF-IDF特征的矩阵。

  • ngram_range:词组切分的长度范围。该范围之内的n元feature都会被提取出来,这个参数要根据自己的需求调整。

1
vectorizer = TfidfVectorizer(min_df = 0.0, analyzer="char", sublinear_tf=True, ngram_range=(1,3))

样本集

  • 作者使用txt格式的样本集,每一行为一个样本,分“goodqueries.txt”和“badqueries.txt”。 截取几行:
1
2
3
/top.php?stuff='uname >q36497765 #
/h21y8w52.nsf?<script>cross_site_scripting.nasl</script>
/ca000001.pl?action=showcart&hop=\"><script>alert('vulnerable')

机器学习算法

作者使用逻辑回归算法,算法虽然简单,但效果还比较好:) 比较适合刚写机器学习代码不久的我:)

1
lgs = LogisticRegression(class_weight={1: 2 * validCount / badCount, 0: 1.0})

1
2
3
4
Accuracy: 0.999420
Precision: 0.984403
Recall: 0.998520
F1-Score: 0.991411

各项指标都很高啊2333

参考资料

贴上作者源代码: 源代码链接:Fwaf-Machine-Learning-driven-Web-Application-Firewall