基于朴素贝叶斯分类器模型的SQL注入检测
模型选用朴素贝叶斯分类器进行训练,并在测试集上进行了预测。综上所述,该朴素贝叶斯分类器在SQL注入检测任务上展现出了优秀的性能,无论是在区分正负样本的能力还是在降低误判率上都有着出色的表现。,模型在测试集上正确预测样本类别的比例很高,接近于1,说明该朴素贝叶斯模型对于识别SQL注入行为具有很好的整体准确性。,这表明模型对于SQL注入样本(正类)的识别能力极强,所有实际为SQL注入的样本都被成功识别
综述
实现了一个针对SQL注入检测任务的朴素贝叶斯分类器模型。首先,它导入了多种数据处理和机器学习库,并加载了一个包含SQL语句及其标签(是否为SQL注入)的数据集。通过CountVectorizer对文本特征进行提取,去除停用词后将文本转换为词频向量。接着,数据被划分为训练集和测试集。
模型选用朴素贝叶斯分类器进行训练,并在测试集上进行了预测。结果显示,该朴素贝叶斯模型在测试集上的准确率高达0.9833,表明其在区分SQL注入与非注入语句方面表现出色。同时,F1分数达到0.9701,体现了模型在查准率和查全率之间的良好平衡。
此外,计算出的敏感性(召回率)为1.0,说明所有实际的SQL注入案例都被正确识别;特异度为0.9772,意味着模型在避免误报(非SQL注入被错误判断为注入)方面也表现优秀。精确度为0.9419,进一步证明模型预测结果较为可靠。
实现步骤:
- 导入必要的库:包括pandas用于数据处理、sklearn中的CountVectorizer用于文本特征提取、train_test_split用于划分训练集和测试集、nltk.corpus.stopwords获取英文停用词、多种机器学习模型如逻辑回归、随机森林、支持向量机和朴素贝叶斯等,以及TensorFlow和numpy等深度学习和科学计算相关库。
- 忽略警告信息,通过warnings.filterwarnings(‘ignore’)来避免显示可能存在的警告信息。
- 读取数据集并定义特征(Sentence列)和标签(Label列)。
- 使用CountVectorizer对文本特征进行预处理,去除低频词和停用词,并将文本转换为词频矩阵。
- 划分训练集和测试集,使用0.8的数据作为训练集,剩余的0.2作为测试集。
- 使用朴素贝叶斯模型进行训练,并在测试集上进行预测。
- 计算并输出朴素贝叶斯模型在测试集上的准确率和F1分数。
- 计算混淆矩阵,并基于混淆矩阵进一步计算灵敏度(召回率)、特异度以及精确率。
实现代码:
以下是库的导入,用于数据处理、特征提取、模型选择、性能评估和深度学习等任务。
import pandas as pd # 用于数据处理
from sklearn.feature_extraction.text import CountVectorizer # 用于文本特征提取
from sklearn.model_selection import train_test_split # 用于数据集划分
from nltk.corpus import stopwords # 用于获取停用词
from sklearn.metrics import accuracy_score, f1_score # 用于评估模型性能
from sklearn.linear_model import LogisticRegression # 逻辑回归模型
from sklearn.ensemble import RandomForestClassifier # 随机森林模型
from sklearn.svm import SVC # 支持向量机模型
from sklearn.naive_bayes import GaussianNB # 朴素贝叶斯模型
import tensorflow as tf # TensorFlow库
import numpy as np # 用于科学计算
from sklearn.metrics import confusion_matrix # 用于计算混淆矩阵
from tensorflow.keras import models, layers # 用于构建深度学习模型
import warnings # 用于处理警告
# 忽略警告信息
warnings.filterwarnings('ignore')
数据读取及预处理
# 读取数据集
df = pd.read_csv("../input/sql-injection-dataset/sqli.csv",encoding='utf-16')
# 定义特征和标签
X = df['Sentence']
y = df['Label']
# 使用词频向量化处理文本数据
vectorizer = CountVectorizer(min_df = 2, max_df = 0.8, stop_words = stopwords.words('english'))
X = vectorizer.fit_transform(X.values.astype('U')).toarray()
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=1)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)
模型训练及预测
# 使用朴素贝叶斯模型进行训练和预测
nb_clf = GaussianNB()
nb_clf.fit(X_train, y_train)
y_pred = nb_clf.predict(X_test)
# 输出朴素贝叶斯模型在测试集上的准确率和F1分数
print(f"Accuracy of Naive Bayes on test set : {accuracy_score(y_pred, y_test)}")
print(f"F1 Score of Naive Bayes on test set : {f1_score(y_pred, y_test)}")
# 计算混淆矩阵
confusion = confusion_matrix(y_test, y_pred)
# 从混淆矩阵中计算灵敏度(召回率)
TP = confusion[1, 1]
TN = confusion[0, 0]
FP = confusion[0, 1]
FN = confusion[1, 0]
sensitivity = TP / float(FN + TP)
print("sensitivity=",sensitivity)
specificity = TN / (TN + FP)
print("specificity=",specificity)
# 计算精确度、召回率和F1分数
Precision = TP / float(TP + FP)
Recall = TP / float(TP + FN)
F1 = 2*((Precision*Recall)/(Precision+Recall))
print ("Precision=",Precision)
运行结果:
朴素贝叶斯分类器在处理SQL注入数据集上的性能表现分析:
-
准确率: 0.9833,模型在测试集上正确预测样本类别的比例很高,接近于1,说明该朴素贝叶斯模型对于识别SQL注入行为具有很好的整体准确性。
-
F1分数: 0.9701,这是综合考虑精确度和召回率的一种评价指标。F1值较高意味着模型在平衡查准率和查全率方面表现良好,通常用于衡量分类问题中模型的表现优劣。
-
灵敏度/召回率: 1.0,这表明模型对于SQL注入样本(正类)的识别能力极强,所有实际为SQL注入的样本都被成功识别出来了。
-
特异度: 0.9772,表示非SQL注入样本(负类)被正确识别的比例也相当高,即模型在减少误报方面的表现优秀。
-
精确度: 0.9419,这意味着模型预测为SQL注入的样本中有94.19%确实为SQL注入,反映了模型预测结果的可靠性。
综上所述,该朴素贝叶斯分类器在SQL注入检测任务上展现出了优秀的性能,无论是在区分正负样本的能力还是在降低误判率上都有着出色的表现。不过,在实际应用时还需结合具体业务需求与场景进行进一步优化调整。
有待优化
- 尝试不同的文本预处理方法(如TF-IDF、Word2Vec、BERT等嵌入式表示),看哪种方法能提高模型性能。
- 尝试调整CountVectorizer参数,比如ngram_range、min_df、max_df等,找到最佳参数组合。
- 不仅限于朴素贝叶斯模型,可以对比其他已导入的机器学习模型(逻辑回归、随机森林、支持向量机等)或者利用TensorFlow构建深度学习模型的效果。
- 对过拟合或欠拟合问题进行处理,例如正则化、早停法、集成学习等技术。
- 如果样本不平衡,可以采用重采样策略(如过采样、欠采样或SMOTE等)平衡训练集。

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)