用逻辑回归模型解析恶意Url

这篇博客介绍了如何利用逻辑回归模型对Url进行恶意检测。通过将Url转换为输入向量并计算其tf-idf值,再利用sklearn库进行模型训练,判断Url是善意还是恶意。博客详细解释了逻辑回归模型的工作原理、输入向量的构建以及模型训练过程。
摘要由CSDN通过智能技术生成

用逻辑回归模型解析恶意Url

这篇博客是笔者在进行创新实训课程项目时所做工作的回顾。对于该课程项目所有的工作记录,读者可以参阅下面的链接。

参考资料

我们首先对下面的链接作者表达感谢:

还有其他很多网页也提供了很多帮助,我们就不一一列举了。

问题背景描述

在日常生活中,我们习惯于在浏览器地址栏里输入url,然后前往心仪的网站浏览网页。同时,我们通过浏览器,不知不觉间向目标网站发送了很多请求。在火狐浏览器按下F12,在网络选项卡里就能看到正常的网页请求:
正常的网页请求然而,有时网页遇到的网页请求可能是别有用心的,比如说有些人特地使用一些url字符串进行SQL注入。这就要求网站能够辨别出网页请求的url字符串是善意的,还是恶意的。

url字符串 性质 标记
/103886/ 善意,正常访问 0
/help.php?q='uname >q23433168 # 恶意,SQL注入 1
/htbin/windmail.exe 恶意,可能会运行事先植入的恶意程序 1

我们需要解决的问题是:训练一个模型,将一个url字符串输入到这个模型中,判断该url请求是否是善意的,从而返回这个url所对应的标记(0表示善意,1表示恶意)。比如,输入一个url请求:"/103886/",由于它是善意的,模型应该输出0.

我们可以看到,这个问题是一个二元分类问题:对于所有输入的url字符串,我们的模型要把它们分为“善意”和“恶意”两类。在这篇博客里,我们将要使用逻辑回归模型(Logistic Regression)来解决这个问题。在下面的阐述中,我们有时会用“正常请求”指代“善意请求”,用“异常请求”指代“恶意请求”。

逻辑回归模型

什么是逻辑回归模型

逻辑回归模型,是一个用来对输入向量进行分类的模型,既可以对输入向量进行二元分类(就是分成两类),也可以进行多元分类(就是分成多类)。我们可以这样考虑:我们可以把每一个输入的url都分别用一个向量表示,然后用逻辑回归模型对这些向量进行二元分类,这样我们就完成了对url是否善意的鉴别。在这篇博客里,我们只讨论使用逻辑回归模型进行二元分类,不讨论多元分类。

下图展示了我们怎么利用逻辑回归模型来预测一个url的分类标签:
在这里插入图片描述(其中输入向量x的数据是随便写的,只是为了展示直观)

我们首先将url字符串转换为一个输入向量,然后通过图右侧的两个公式来计算标量 p,最后我们根据计算出来的 p 值四舍五入返回标签。这样,我们就会发现,图中展示的这两个公式是非常关键的,它们用来计算一个url字符串的标签值;同时,由于 p 的取值范围是[0, 1],我们也可以认为 p 是一个url的标签为1(恶意)的概率。在公式中, w 是一个和 x 维度一致的向量,b 是一个标量,w 和 b 都是模型需要训练的参数。在一开始,这两个参数都是被随机值初始化的。

接下来,让我们考虑怎么训练这个模型。首先定义一个损失函数,它来表征模型的好坏。我们知道,p 可以被认为是一个url的标签为1(恶意)的概率。如果这个url确实是恶意的,那么我们就可以说 y 是我们将这个url预测正确的概率(把握);相似地,如果这个url是善意的,那么我们可以说 1-p 是我们将这个url预测正确的概率(把握)。这样,我们就可以得到我们将一个url预测正确的概率:(y 代表正确的标签,取值为0或1)
一个url预测正确的概率
接下来,我们把测试集所有url预测正确的概率乘起来,就可以代表这个模型预测测试集中所有url的准确程度,这个值越接近于1,就代表模型越准确,而这个值越接近于0,就代表模型越不准确:
总体概率
然后,为了不让概率相乘时在计算机上出现下溢,我们要对上面的式子取对数,这样我们得到的就是一个总和。为了让这个总和不受测试集中包含的url个数所影响,我们取一下算术平均,最后我们加一个负号,这样我们就得到了损失函数 L。这个函数值越小,代表模型越精确。
损失函数
损失函数定义好了,接下来我们就是要采用梯度下降的方案,对损失函数进行优化了。关于相关的细节,读者可以参考这个链接,下面我们着重讲一下怎么把逻辑回归模型套用到url恶意识别这个问题上来。

这个问题中输入向量 x 是什么

我们在上一小节中提到,我们将一个url请求字符串转化为一个输入向量 x 。现在,我们有一个问题:我们是怎么将url字符串,映射成一个输入向量的呢?下面的图解释了url字符串映射成输入向量的整体过程:
在这里插入图片描述这里,我们需要着重解释一下 tf-idf 值的计算方法。如上图所示,对于某一个url中的每一个5-gram字符串,我们都要计算对应的 tf-idf 值。比如说,对于第 d 个url,其中对应的id序号为 t 的5-gram字符串,我们计算 tf-idf 值如下:
首先,tf-idf 值是这个字符串对应的 tf 值与 idf 值相乘得到的结果:
tf-idf公式
其中,tf (d,t) 表示第 d 个url中id序号为 t 的5-gram字符串出现的次数,比如,"/103886/“中”/1038"一共出现了1次,那么 tf = 1;而 idf (t) 的值定义如下:
idf公式
其中,df (t) 表示id序号为 t 的5-gram字符串出现在几个url中。在上面的例子中,就是"/1038"出现在几个url中。这样,我们就可以计算对应url中每个5-gram中的 tf-idf 值了。然后,我们将所有的 tf-idf 值进行 L2-归一化:
在这里插入图片描述
这样,我们就计算好了所有的 tf-idf 值。注意到这里的 idf 值是与课本中的定义式不同的,这可能与数值稳定性有关。参见这个链接的说明。这样,所有的url中包含的5-gram的 tf-idf 值都计算好了,按照上面图示的指示,我们就得到了所有的输入向量,这些输入向量可以组成一个矩阵。下面的截图给出了运行程序时这个矩阵的部分内容:
在这里插入图片描述
其中第一行表示第0行、第26929列的 tf-idf 值是0.5091180183785077,这个矩阵中的每一行都代表一个url的输入向量。这个矩阵大小是1342157 * 88816,表示训练集中一共有1342157个url,每一行对应的输入向量都有88816维,每一行中没有提到的项目值都是0.

这个问题中需要训练的参数是什么

正如“什么是逻辑回归模型”这一节中所述,这个问题中需要训练的参数就是 w 向量(根据上面截图中的矩阵的维度, w 向量与输入向量的维度相同,是88816维),以及 b 标量。这两个量训练好之后,我们就可以按照“什么是逻辑回归模型”这一节中的流程,计算出来未知url的标签,从而判断它是否是善意的。

sklearn库简介

在这个博客中,我们不准备自己手动实现逻辑回归模型,而是准备调用sklearn库来解决问题。sklearn库是一个基于python语言的机器学习组件库,提供了不少使用的模型与方法。下面,我们结合上面博文里所述的原理,给出使用sklearn库实现的核心代码:

from sklearn.feature_extraction.text import TfidfVectorizer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值