机器学习之恶意流量检测的特征工程
字数 1299 2025-08-18 11:39:15
机器学习在恶意流量检测中的特征工程实践
1. 背景与概述
在网络安全领域,恶意流量检测是保护系统安全的重要环节。传统机器学习方法中,特征工程的质量直接决定了模型性能的上限。本文详细介绍了如何通过精心设计的特征工程方法来检测恶意流量,特别是针对XSS(跨站脚本)攻击的检测。
2. 特征工程基础
2.1 特征工程的重要性
- 定义:特征工程是将原始数据转换为更能代表问题本质的特征的过程
- 核心观点:数据和特征决定了机器学习的上限,模型和算法只是逼近这个上限
- 类比:如同将"姚明"转化为"身高2.2米、体重400斤"等数值特征
2.2 恶意流量检测的特征工程方法
- 传统方法:使用Tfidf-ngram方式
- 安全领域方法:基于安全专家知识定义不同维度的特征
3. 恶意流量特征提取实践
3.1 样本分析
正例样本(正常流量)特征:
format=xml&platform=ppap&channel=withoutchannel
filename=sgim_eng.zip&h=B2EF665558623D671FC19AC78CA2F0F3
md5=d10015a0eb30bd33bb917e1d527c649
负例样本(XSS攻击)特征:
<script>alert(/xss/)</script>
'><script>alert(document.cookie)</script>
<div/onmouseover='alert(1)'>X</div>
<BODY ONLOAD=alert('helloxworldss')>
3.2 特征维度设计
关键词维度特征
javascript:
script
confirm=
onblur=
src=
onmouseover=
onload=
onerror=
alert
prompt
符号维度特征
> ' " * / = : ( ) < ` \ ; < >
3.3 特征预处理
- 统一大小写:将所有字符转换为小写
- URL处理:对URL中的特殊值统一降噪转换为"x"
- 其他可能特征:
- payload长度
- 请求响应时间
- IP或来源指纹请求次数
4. 特征量化与标准化
4.1 特征向量示例
| payload | 关键词维度 | 符号维度 | 特征编码 |
|---|---|---|---|
<form id="test" /><button form="test" formaction="javascript:alert(1)"> |
javascript, alert | (),:"",<> | [2,7] |
| `num="><'/ | [2,6] |
4.2 Min-Max标准化
公式:
X_new = (X - X_min) / (X_max - X_min) * (New_max - New_min) + New_min
示例:收入73600在12000-98000范围内标准化到[0,1]:
(73600 - 12000)/(98000 - 12000) = 0.716
5. 代码实现详解
5.1 数据加载
def loadFile():
badXss = "./badx.txt" # 恶意样本文件
goodXss = "./goox.txt" # 正常样本文件
bf = [x.strip().lower() for x in open(badXss, "r").readlines()]
gf = [x.strip().lower() for x in open(goodXss, "r").readlines()]
return bf, gf
5.2 特征工程
def MakeFeature(x):
charList = ["onmouseover=", "onload=", "onerror=", "javascript",
"alert", "src=", "confirm", "onblur"]
markList = [">", "'", "\"", "*", "/", "=", ":", "(", ")", "<", "`", "\\", ";", "<", ">"]
featureList = []
for i in x:
char_count, mark_count = 0, 0
payload = urllib.parse.unquote(i.lower().strip())
for charts in charList:
char_count = payload.count(charts) + char_count
for marks in markList:
mark_count = payload.count(marks) + mark_count
featureList.append([char_count, mark_count])
return featureList
5.3 模型训练
def train(x, y):
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.4, random_state=666)
NBM = [
MultinomialNB(alpha=0.01), # 多项式模型-朴素贝叶斯
BernoulliNB(alpha=0.01),
DecisionTreeClassifier(max_depth=100),
RandomForestClassifier(criterion='gini', max_depth=100, n_estimators=200),
LogisticRegression(random_state=40, solver='lbfgs', max_iter=10000,
penalty='l2', multi_class='multinomial',
class_weight='balanced', C=100),
LinearSVC(class_weight='balanced', random_state=100, penalty='l2',
loss='squared_hinge', C=0.92, dual=False),
SVC(kernel='rbf', gamma=0.7, C=1)
]
NAME = ["多项式", "伯努利", "决策树", "随机森林", "线性回归", "linerSVC", "svc-rbf"]
for model, modelName in zip(NBM, NAME):
model.fit(x_train, y_train)
pred = model.predict(x_test)
dts = len(np.where(pred == y_test)[0]) / len(y_test)
print("{} 精度:{:.5f} ".format(modelName, dts * 100))
joblib.dump(model, './model.pkl')
5.4 预测实现
def predicts(x):
clf = joblib.load('./model.pkl')
return clf.predict(x)
def run():
badx, goodx = loadFile()
goodx = MakeFeature(goodx)
badx = MakeFeature(badx)
goody = [0] * len(goodx)
bady = [1] * len(badx)
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(bady)
x = np.array(goodx + badx).reshape(-1, 2)
y = np.array(goody + bady).reshape(-1, 1)
train(x, y)
testX = ["<script>alert(1)</script>", "123123sadas",
"onloads2s", "scriptsad23asdasczxc", "onload=alert(1)"]
x = MakeFeature(testX)
for res, req in zip(predicts(x), testX):
print("XSS==>" if res == 1 else "None==>", req)
6. 实验结果与分析
6.1 各模型精度对比
| 模型名称 | 预测精度 |
|---|---|
| 多项式(朴素贝叶斯) | 74.9% |
| 伯努利 | 72.5% |
| 决策树 | 73.9% |
| 随机森林 | - |
| 线性回归 | 72.5% |
| SVM | 74.7% |
6.2 预测示例
输入测试样本:
<script>alert(1)</script>
123123sadas
onloads2s
scriptsad23asdasczxc
onload=alert(1)
预测结果:
XSS==> <script>alert(1)</script>
None==> 123123sadas
None==> onloads2s
None==> scriptsad23asdasczxc
XSS==> onload=alert(1)
7. 总结与改进建议
7.1 当前方法局限性
- 特征维度不够多,特征保留不充分
- 正常样本中存在大量干扰特征
- 平均精度仅约74%
- 特征维护成本高:"有多少智能就有多少人工"
7.2 改进方向
- 增加更多特征维度
- 考虑使用深度学习等自动特征提取方法
- 结合其他安全指标(如请求频率、来源IP信誉等)
- 使用集成学习方法提高精度
7.3 方法选择建议
虽然监督学习具有良好的可解释性,但在实际应用中需要权衡:
- 特征工程的维护成本
- 模型精度的要求
- 系统的实时性需求
可以考虑结合传统规则引擎与机器学习方法,构建多层次的防御体系。