硕士论文源代码: 利用机器学习增强 Web 应用防火墙以检测 SQL 注入
| 作者 | Lilliane Linnet Musoke |
| 机构 | 雷丁大学计算机科学系 |
| 专业 | 数据科学与高级计算理学硕士 |
| 导师 | Atta Badii 教授 |
| 提交日期 | 2024年9月17日 |
两条新颖的混合机器学习流水线,每条均以独立的 Jupyter notebook 实现,用于检测 Web 应用流量中的 SQL 注入(SQLi)攻击:
DistilBERT_Stacked_Ensemble_pipeline.ipynb — DistilBERT-堆叠集成(元学习器)流水线。使用 DistilBERT 上下文嵌入作为传统机器学习与集成分类器(逻辑回归、XGBoost、SVM)堆叠层的输入,并在神经网络元学习器下进行组合。使用快速梯度符号法(FGSM)执行对抗训练;使用 Optuna 调整超参数。BERT_GNN_pipeline_FINAL.ipynb — BERT–图神经网络混合流水线。BERT 生成 SQL 查询的上下文嵌入;GNN 对图结构的查询表示进行建模,以捕获结构模式。使用 Optuna 调整超参数。以及用于训练和评估两条流水线的数据集:
SQL_Injection_Dataset.csv — 带标签的 SQL 查询(良性 vs 恶意)。两条混合流水线的全部四项性能指标(准确率、精确率、召回率、F1 分数)均达到相同的主要数值。完整的逐模型表格、混淆矩阵、ROC 曲线、学习曲线和敏感性分析见 notebooks 及论文中。
DistilBERT-堆叠集成的对抗准确率 99.77% 比 Guan 等人(2023 年,Future Internet 15(4):133,DOI 10.3390/fi15040133)报告的同类对抗测试结果高出 2.38% — 完整对比见论文 §4.4。
.ipynb 文件包含完整的流水线代码(数据加载、预处理、嵌入、训练、评估、对抗鲁棒性、敏感性分析)。输出已被剥离,以便 notebooks 在 GitHub 上快速渲染且体积较小;从上到下运行任一 notebook 即可重新生成所有图表。RESULTS.md 以可查看的图库形式展示所有图表(混淆矩阵、ROC 曲线、学习曲线、敏感性分析图、逐模型对比),无需运行任何代码。results/ 文件夹中,按流水线和章节命名。已在 Python 3.10+ 及 Jupyter 环境下测试。安装所有依赖:
python -m venv .venv
source .venv/bin/activate # macOS / Linux
.venv\Scripts\activate # Windows
pip install -r requirements.txt
然后在 JupyterLab 或 VS Code 中打开任一 notebook,从上到下运行单元格。每条流水线均为端到端自包含:数据加载与预处理 → 嵌入提取 → 模型训练 → 评估 → 对抗鲁棒性检查 → 敏感性分析。BERT-GNN 训练步骤建议使用 GPU,但推理或 DistilBERT-堆叠集成不需要 GPU。
资源需求。 DistilBERT(及 BERT)嵌入提取步骤会同时将语言模型及其全数据集嵌入保存在内存中。端到端执行需要约 6–8 GB 可用 RAM(DistilBERT-堆叠集成流水线)和 8–12 GB(BERT-GNN)。这些 notebooks 最初是在 Google Colab 上开发的(提供 12–16 GB 内存和免费 GPU)。如果在总内存为 8 GB 的本地机器上运行,请先关闭其他应用程序,或通过每个 notebook 顶部的徽章链接在 Colab 中运行。
仓库根目录中的脚本可重新生成修订版 BERT-GNN 论文中报告的扩展分析(消融实验、修正的保留集评估、结构感知图、混淆鲁棒性、七项测试鲁棒性套件、完整指标及跨模型执行时间)。这些脚本读取已提交的 SQL_Injection_Dataset.csv,将输出写入 results/,并在 .structure_work/ 和 .corrected_work/ 下缓存中间产物(BERT 嵌入、图、训练好的模型)。这些缓存目录有意不被跟踪;每个脚本都会从数据集重建它们且可恢复运行,因此在仅 CPU 的机器上中断的运行只需重新启动即可继续。
这些脚本通过缓存形成生产者→消费者链,因此请按以下顺序运行(每个步骤只需数据集及先前步骤写入的缓存):
pip install -r requirements.txt
python structure_graph_gnn.py # 结构图 + best.json(Optuna)+ 结构 GNN 结果
python corrected_bertgnn_retrain.py # 保留集验证重训练(链式图)-> 修正结果
python extract_train_cls.py # 训练集 BERT [CLS] 嵌入(train_cls.npy)
python bert_only_ablation.py # 在相同测试集上的纯 BERT 头部
python obfuscation_robustness.py # 训练并缓存 gnn_model.pt / mlp_model.pkl;逃逸召回率
python robustness_1_sensitivity.py # 七项测试鲁棒性套件,每项一个脚本
python robustness_2_adversarial.py
python robustness_3_obfuscation_extended.py
python robustness_4_adaptive.py
python robustness_5_crossdataset.py
python robustness_6_significance.py
python robustness_7_calibration.py
python metrics_summary.py # 完整逐类别指标表
python complexity_breakdown.py # 按查询复杂度划分的准确率(表 4)
python make_result_figures.py # 混淆矩阵 + 对比图表
python model_execution_times.py # 所有模型的训练 + 推理时间
所有脚本均相对于仓库解析其路径,使用固定随机种子(random_state=42),且无需任何参数。完全支持在 CPU 上运行(GPU 仅加速嵌入和 GNN 训练步骤)。
复现精度预期。 数值可复现到约 ±0.1–0.2 个百分点,而非逐位一致。微小差异来自 CPU 与 GPU 执行、PyTorch 非确定性,以及早停轮次在不同运行间相差一两轮。所报告的结论(图结构不带来干净准确率提升,但提高了对 URL 编码逃逸的鲁棒性,以及相关的统计检验)在该误差范围内是稳定的。
导师:Atta Badii 教授(雷丁大学)。同时感谢博士生 Ahmed Ashlam 在项目执行期间提供的建议。两者均在论文中致谢。
如果您引用本作品:
Musoke, L. L. (2024). Enhancing Web Application Firewall with Machine Learning for SQL Injection Detection. MSc dissertation, University of Reading.
以 MIT 许可证 发布。
本 GitHub 仓库镜像了雷丁大学机构 Gitlab 上的原始提交:https://csgitlab.reading.ac.uk/qz820024/sql-injection-pipeline-project。
原创声明(来自论文): "我,Lilliane Linnet Musoke,来自雷丁大学计算机科学系,特此证明这是我的原创作品,除非在我明确承认其他作者贡献的情况下。"
| 流水线 | 准确率 | 对抗准确率(FGSM) | 备注 |
|---|
| DistilBERT-堆叠集成 | 99.81% | 99.77% | 被选为推荐方案;执行速度快 |
| BERT-GNN | 99.48%(保留集 99.67%) | — | 结构理解能力更优;执行时间较长(23.13 秒);保留集验证重训练达到 99.67%,详见 RESULTS.md |
| 最佳传统基线(随机森林) | 94.47% | — | 在同一研究中进行了基准测试 |