这次我们来看一个毕业设计向的 XSS 漏洞智能检测系统。它的重点不是单个算法的堆叠,而是把 LLM 大模型、AI 智能体和机器学习放到同一条 XSS 检测流水线里:先做规则与特征层快速筛掉一部分流量,再交给机器学习模型做疑似判定,拿不准的样本送入 LLM 做语义分析,最后由智能体汇总证据、生成人类可读的检测报告。
从项目定位来看,它至少有几个值得关注的点:第一,技术栈覆盖当前热门的 LLM、Agent、机器学习三个方向,适合作为信息安全或网络空间安全专业的毕业设计选题;第二,标题里明确了交付物包含源码、文档、PPT 和讲解,这意味着它不只是“能跑的代码”,而是围绕完整答辩流程设计的一套材料;第三,既然是智能检测系统,大概率会提供 Web 界面和接口服务,既能直接演示,也方便二次开发。
这篇文章会按照“先看规格,再讲架构,然后部署,接着验证,最后排查”的顺序展开。内容覆盖:系统应该怎么理解、环境怎么准备、服务怎么启动、XSS 样本怎么测试、API 怎么调用、批量任务怎么设计、显存和性能怎么观察、常见问题怎么解决。如果你正在选型安全类毕业设计,或者想了解 LLM 在安全检测里的实际落地思路,这篇可以直接收藏。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 项目类型 | 基于 LLM 大模型 + AI 智能体 + 机器学习的 XSS 漏洞智能检测系统,面向毕业设计场景 |
| 核心思路 | 机器学习负责快速分类与特征过滤,LLM 负责语义深度分析和混淆载荷识别,AI 智能体负责流程编排、证据汇总和报告解释 |
| 主要检测对象 | XSS 跨站脚本攻击载荷,覆盖反射型 XSS、存储型 XSS、DOM 型 XSS 等常见类型,具体范围以源码实现为准 |
| 交付内容 | 源码、项目文档、答辩 PPT、讲解材料 |
| 运行平台 | 以 Python 技术栈为主,Windows / Linux 均可部署,具体以源码 requirements 为准 |
| 启动方式 | 命令行启动 Web 服务或 API 服务,可能带 Web 管理界面,具体入口以源码 README 为准 |
| GPU 要求 | CPU 可运行整体流程;如果本机加载大模型权重做深度推理,推荐 NVIDIA 显卡并预留显存,具体占用取决于模型规模和推理参数 |
| 是否支持 API | 从系统架构看应提供检测接口和批量检测接口,接口路径、请求字段需按实际源码调整 |
| 是否支持批量任务 | 支持批量 URL 或批量 Payload 检测,并可输出结构化结果,批次大小以源码配置为准 |
| 适合场景 | 毕业设计、安全课程设计、XSS 检测技术演示、安全工具原型开发、LLM 安全应用研究 |
2. 适用场景与使用边界
2.1 这个系统适合谁
对毕设而言,这个系统的定位比较明确:信息安全、网络空间安全、计算机科学与技术相关专业的学生,需要完成一个有技术深度、能演示、能写论文、能应对答辩的完整项目时,这种“LLM + Agent + 机器学习”的选题方向是比较讨巧的。它既有传统机器学习的实验数据、特征工程和模型对比,又有大模型时代的语义理解、Prompt 设计和 Agent 编排,天然能写出跨两个技术阶段的创新点。
对安全从业者和开发者也同样有参考价值。如果你想研究的是“大模型到底能不能提升 XSS 检测能力”,或者想做一个轻量的安全检测工具原型,那么这套系统的分层思路可以借鉴:规则快速过滤、机器学习打分、LLM 兜底精判,在成本和效果之间做一个可控的折中。
2.2 它不能替代什么
需要说清楚:从项目定位看,这是一个面向教学、演示和研究的检测系统,不建议直接把它当生产级 WAF 或大规模安全扫描器使用。生产环境要考虑并发性能、误报率调优、攻击载荷的持续更新、数据隐私、审计日志等一堆工程问题,这些都是毕设源码之外的东西。另外,如果你没有授权,不要拿这个系统去扫描公网站点,也不要收集未授权目标的流量,否则不只是技术问题,还是合规问题。
2.3 版权、隐私与安全边界
如果系统里接入了外部 LLM API,注意不要直接把包含真实用户名、Cookie、Token 的业务流量明文传给外部服务。内部测试用本地构造的 XSS Payload 就可以完成验证。代码、训练样本、PPT 素材如果来自网络公开资源,二次分发时要确认许可证。涉及漏洞利用相关内容,只应该在自建靶场或本地测试环境里做验证。
3. 系统设计与技术架构
3.1 整体分层
从标题和三段技术栈来看,这套系统的架构可以理解为一条流水线。下面给出一种符合项目定位的常见分层设计,实际源码如果不同,以源码为准。
第一层是数据采集与预处理层。系统接收 URL、HTML 片段、JavaScript 片段或完整的 HTTP 请求,先做 URL 解码、HTML 实体解码、大小写归一化、去掉多余空白,再提取脚本标签、事件属性、href / src 属性、特殊字符分布等基础特征。这一层解决的是“输入要统一”的问题,因为 XSS Payload 经过编码和变形后,字面上差异很大,必须先还原。
第二层是规则与特征层。维护一组常见 XSS 特征规则,比如<script>、onerror=、javascript:、alert(、<svg/onload=等关键模式,先做快速命中。规则命中直接标记为高危;规则未命中但特征可疑的样本流入后续机器学习模块。这样做的价值是降低 LLM 的调用量,因为大模型推理比规则匹配贵得多。
第三层是机器学习检测层。对 Payload 做 TF-IDF、N--gram 或其他文本特征编码,送入训练好的分类模型,输出是否为 XSS 的概率。常用的模型选择包括朴素贝叶斯、逻辑回归、支持向量机、随机森林或 XGBoost,具体以项目源码为准。机器学习的优势是能泛化到规则没覆盖的变种,但它也容易误报,所以需要结合阈值控制。
第四层是 LLM 大模型分析层。对机器学习判断为“疑似”或“边界”的样本,交由大模型从语义层面判断:这段脚本是正常的业务逻辑,还是恶意代码混淆后的攻击载荷?同时让 LLM 输出解释,说明为什么判定为 XSS、攻击参数在哪里、可能造成什么影响。这一层解决的是可解释性问题,也是答辩时最容易展示创新的点。
第五层是 AI 智能体编排层。智能体负责串联整个流程:看预处理结果、调用机器学习模型、决定要不要请求 LLM、汇总不同模块的判定结果、最后生成统一报告。更完整的做法是让智能体自动构造验证 Payload,在测试环境里把弹窗结果截图,作为检测结论的证据。
第六层是结果输出层。输出结构化 JSON,包含字段、判定结果、置信度、命中的规则、机器学习得分、LLM 解释、修复建议。同时生成页面展示检测记录,方便演示与答辩截图。
3.2 各模块之间的数据流
一条典型的数据流是这样的:
输入 URL/Payload -> 预处理,规范化文本 -> 规则快速命中 -> 命中:直接输出高危 -> 未命中:进入特征提取 -> 机器学习模型打分 -> 低分:输出安全 -> 高分:输出恶意 -> 中间区间:送入 LLM 语义分析 -> AI 智能体汇总多层结论,调用 LLM 生成解释 -> 输出 JSON + 检测报告4. 环境准备与前置条件
4.1 操作系统与 Python 环境
从项目定位看,这套系统大概率基于 Python 实现。建议在 Windows 10/11 或 Ubuntu 20.04/22.04 上部署。Python 版本优先选择 3.9 到 3.11,因为部分机器学习依赖对过新的 Python 版本支持滞后。
创建虚拟环境是很重要的一步,防止不同项目的第三方库互相污染:
python -m venv venv # Windows venv\Scripts\activate # Linux / macOS source venv/bin/activate4.2 依赖安装
后端依赖一般包括 Flask 或 FastAPI、scikit-learn、joblib、pandas、numpy、requests、BeautifulSoup4 等。如果系统需要本地跑 LLM,可能还会用到 transformers、torch、accelerate;如果走外部 LLM API,则只需要对应 SDK 或 HTTP 客户端。
安装依赖的方式通常是:
pip install -r requirements.txt如果 PyTorch 安装太慢,可以先用 CPU 版本跑通流程,有显卡后再换 CUDA 版本。更稳妥的做法是进入 PyTorch 官网选择对应的 CUDA 版本安装命令,避免用 pip 默认源下载巨型安装包。
4.3 模型文件和配置说明
从系统设计看,模型文件至少分为两类:一是机器学习分类器权重文件,通常是.pkl、.joblib或.pt格式;二是 LLM 模型权重,如果采用本地部署。机器学习权重文件一般几十到几百 MB,LLM 权重则可能是几 GB 到几十 GB。
拿到源码后,先看模型文件是否在项目里。如果没有,要按 README 说明下载并放置到指定目录。LLM 部分如果支持接入外部 API,注意配置 API Key、Base URL 和模型名,不要把 Key 写死在代码里。建议用.env文件管理敏感配置:
# .env 示例,字段名以源码为准 LLM_API_KEY=your_api_key LLM_BASE_URL=https://api.example.com LLM_MODEL_NAME=your_model_name ML_MODEL_PATH=./models/xss_classifier.pkl4.4 GPU 与磁盘
CPU 可以跑通整条流水线,只是 LLM 推理会明显变慢。如果本机有 NVIDIA 显卡,先确认驱动版本,再安装匹配的 CUDA 和 PyTorch。显存占用不好一概而论:7B 模型用 FP16 推理,显存需求一般在 14GB 到 16GB 左右;用 4bit 量化可以降到 6GB 到 8GB 左右。但这些只是常见经验值,具体以实际部署的模型、上下文长度和并发量为准。如果显存不足,优先考虑使用外部 LLM API 或选择更小的量化模型。
磁盘方面,一个包含 PyTorch、模型权重和项目源码的完整开发目录,预留 30GB 到 50GB 比较稳妥。
5. 安装部署与启动方式
5.1 获取源码并检查目录
部署前先理清源码结构。典型的项目目录大概长这样:
xss_detection_system/ ├── app/ │ ├── main.py # 服务入口 │ ├── api/ # 接口路由 │ ├── core/ # 配置、依赖 │ ├── models/ # 机器学习与 LLM 调用逻辑 │ └── agent/ # 智能体编排逻辑 ├── data/ │ ├── samples/ # XSS 样本集 │ └── models/ # 模型权重存放目录 ├── docs/ # 项目文档 ├── requirements.txt ├── README.md └── .env.example先用ls或 Windows 资源管理器确认文件是否存在。特别关注 README 里的启动命令、模型路径配置、端口号三个关键信息。
5.2 启动 API 服务
如果系统基于 FastAPI,启动方式一般是:
uvicorn app.main:app --host 0.0.0.0 --port 8000如果项目基于 Flask,则是:
python app.py启动后,在浏览器打开http://127.0.0.1:8000,如果看到接口文档页面或健康检查信息,说明服务已经起来了。启动阶段如果报缺少依赖,逐个用 pip 安装缺失包;如果报端口被占用,换一个端口:
uvicorn app.main:app --host 0.0.0.0 --port 80015.3 访问 Web 界面
不少同类项目会把检测界面封装成 Web 页面,使用 Streamlit、Gradio 或 Flask 模板实现。看到页面后,先做一个最简单的验证:输入一个白样本“hello world”,再输入一个黑样本<script>alert(document.cookie)</script>,观察检测结果是否区分开。
需要注意,第一遍跑通不要用复杂样本。先把“正常文本判为安全、经典 Payload 判为恶意”这条主链路打通,再继续测混淆样本。
5.4 模型加载失败时的处理
启动时如果提示找不到模型文件,比如FileNotFoundError或.pkl不存在,就去检查配置里的路径是否写对。如果提示 CUDA 不可用,可以在配置里把设备强制设为 CPU,先确认逻辑没问题,再解决 GPU 加速。
从项目定位看,这套系统的核心是检测流程而不是单点性能,所以第一目标永远是先跑通。
6. 功能测试与效果验证
6.1 经典 XSS 样本验证
检测类系统最怕“模型能跑但没效果”。拿到系统后,先准备一小批测试样本,包含明显的恶意样本、正常的 HTML、模糊的边界样本。
建议先测试下面这些类型:
| 样本类型 | 示例 | 预期结果 |
|---|---|---|
| 正常文本 | hello world | 安全 |
| 正常 HTML | <div class="header">首页</div> | 安全 |
| 脚本标签 | <script>alert(1)</script> | 恶意 |
| 事件属性 | <img src=x onerror=alert(1)> | 恶意 |
| 伪协议 | <a href="javascript:alert(1)">click</a> | 恶意 |
| 编码混淆 | %3Cscript%3Ealert(1)%3C/script%3E | 恶意 |
| 大小写变异 | <ScRiPt>alert(1)</sCrIpT> | 恶意 |
| 业务代码 | if (user.age > 18) { allow(); } | 安全 |
用这组样本过一遍,能看到三个关键结论:规则是否生效、机器学习模型是否正常打分、LLM 是否对边界样本给出合理判断。如果简单脚本标签都漏报,优先排查预处理层,可能是解码逻辑没跑,或者规则列表没加载。
6.2 LLM 语义分析验证
LLM 模块的测试重点不是“它能不能检测”,而是它能不能解释。比如输入一段经过混淆的脚本,让它解释“为什么这段内容是攻击载荷”“解码后实际执行了什么”。如果输出结果包含了攻击原理、触发位置和风险说明,说明智能体对 LLM 的调用与提示词设计是有效的。
如果 LLM 输出不稳定,可以在提示词里约定输出格式。常见的做法是要求模型返回 JSON,字段包括is_xss、confidence、reason、payload_type,然后由代码做格式校验。不要让原始输出直接落库,因为模型有可能输出多余的解释文本或 Markdown 标记。
6.3 误报与漏报验证
安全检测系统一定要看误报。用 100 条正常 HTML 或 JavaScript 片段做测试,统计被误判为恶意的比例。如果误报率偏高,可以从两个方面调整:第一,提高机器学习判定阈值,让它更保守;第二,调整 LLM 的提示词,明确告知识别的是“跨站脚本攻击载荷”,不是任何包含 JavaScript 的代码。
漏报方面,重点观察编码混淆和嵌套变形样本。如果漏报多,说明预处理层的解码还原不够,建议检查是否只做了 URL 解码,而没有做 HTML 实体解码和多重解码。
6.4 判断成功的标准
检测系统的“成功”要有明确口径:
- 经典 Payload 检出率达到预期,至少能稳定识别
<script>、onerror、javascript:等常见模式; - 正常文本不误报;
- LLM 能给出可阅读的解释;
- 检测结果结构化输出,方便程序解析;
- 批量任务不中断,有日志可以回看。
这里不写死具体指标,因为不同样本集差异很大,更合理的做法是记录实验数据,在论文里给出自己的准确率、召回率、误报率。答辩时用你自己的测试数据说话,比引用别人的数字更有说服力。
7. 接口 API 与批量任务
7.1 单条检测接口
检测系统提供 API 是很有必要的,既能演示自动化接入,也能为论文增加“工程落地”的章节。接口设计一般是 POST 一个检测对象:
{ "text": "<script>alert(document.cookie)</script>", "source": "test_case_001" }返回结果大致会包含:
{ "request_id": "abc123", "source": "test_case_001", "is_xss": true, "confidence": 0.95, "rule_hit": ["script_tag"], "ml_score": 0.97, "llm_reason": "检测到可疑的JavaScript脚本标签,包含alert函数,疑似窃取Cookie的XSS攻击载荷。", "suggestion": "对输入进行HTML实体编码,过滤script标签。" }实际字段名以源码为准。下面是一个通用 Python 调用示例:
import requests import json url = "http://127.0.0.1:8000/api/detect" payload = { "text": "<script>alert(document.cookie)</script>", "source": "demo_001" } response = requests.post(url, json=payload, timeout=30) print(response.status_code) print(json.dumps(response.json(), ensure_ascii=False, indent=2))如果接口返回 200,说明单条链路已经通;如果返回 500,去服务端看日志,重点看是模型推理报错,还是类型转换报错。
7.2 批量检测接口
批量任务的本质是一个异步队列:提交一批样本,后台逐个检测,完成后汇总结果。接口设计可以有两种风格:一是同步批量,一次请求带上 100 条样本,最长等待时间容易超时;二是异步任务,接口只返回任务 ID,客户端轮询查询进度。从工程实践看,第二种更适合真实场景。
批量任务输入示例:
{ "items": [ {"text": "<script>alert(1)</script>", "source": "case_001"}, {"text": "<img src=x onerror=alert(1)>", "source": "case_002"}, {"text": "正常页面内容", "source": "case_003"} ] }批量任务要注意三条:第一,任务队列要有唯一 ID;第二,每条样本的检测结果要能关联回原始输入;第三,中间某条样本失败时,不能中断整个批次,要记录错误继续处理。
7.3 curl 验证接口
在浏览器或 Python 之外,用 curl 验证接口最快:
curl -X POST http://127.0.0.1:8000/api/detect \ -H "Content-Type: application/json" \ -d '{"text": "<script>alert(1)</script>", "source": "curl_test"}'如果系统对不同服务设置了鉴权,还需要在请求头里加上 Token。这个看实际源码实现,毕业设计项目一般不会上太复杂的鉴权,但至少应支持按 IP 限制访问范围。
8. 资源占用与性能观察
8.1 观察什么
运行检测服务后,重点观察三块:CPU、内存和显存。CPU 占用可以看出预处理和机器学习推理的压力;内存占用要看模型加载和 Web 服务是否处于合理范围;显存占用只在本地加载 LLM 时才有意义。
观察方式很简单:
- Windows 任务管理器直接看 CPU、内存、GPU 占用;
- Linux 用
top或htop看内存,用nvidia-smi看显存; - 观察 API 响应时间,判断整体链路是否可用。
Python 代码里也可以用psutil记录进程资源占用,用于论文中的性能分析图表:
import psutil import os pid = os.getpid() process = psutil.Process(pid) print(f"CPU%: {process.cpu_percent(interval=1)}") print(f"Memory: {process.memory_info().rss / 1024 / 1024:.2f} MB")显存占用不要凭空给结论。不同模型、不同量化方式、不同请求长度,显存差异很大。你只需要在论文里记录本机的实际数据,比如“本实验环境加载 7B 模型 4bit 量化后,显存峰值约 XX GB”,以你机器实测为准。
8.2 如何控制成本与速度
一个很现实的问题是:如果每一条请求都走 LLM,速度和费用都吃不消。从工程角度最值得优化的点是级联判定。规则命中直接输出高置信度结果,不用再调 LLM;机器学习打分很低或很高的样本也直接输出,只有落在中间区间的样本才调用 LLM。这样大多数常见 Payload 由规则和机器学习消化,LLM 只处理边界样本。
如果本地部署 LLM 实在太慢,可以退而求其次:检测主流程用规则 + 机器学习,LLM 仅用于可解释报告生成。这样门槛低很多,也更接近实际操作中的降本思路。
8.3 降低显存占用的方案
本地跑 LLM 遇到显存不足,可以按顺序尝试以下方案:
- 使用 4bit 或 8bit 量化版本模型;
- 减小输入文本长度,截断过长上下文;
- 降低并发请求数,一次只跑一个推理;
- 换更小的模型版本,比如用 3B/7B 级别替代 13B 级别;
- 用 CPU 推理跑边界样本,虽然慢,但不会被显存卡死;
- 接入外部 LLM API,彻底跳过本地推理开销。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 依赖安装失败 | Python 版本不匹配或依赖包冲突 | 查看 pip 报错信息 | 切换 Python 3.9-3.11,重建虚拟环境 |
| 启动提示缺少模型文件 | 模型权重未下载或路径配置错误 | 检查 models 目录和 .env 配置 | 按 README 下载模型并放到指定目录 |
| 检测接口 500 错误 | 推理链路抛异常 | 查看服务端日志堆栈 | 从规则、特征、LLM 三层逐步定位 |
| CUDA 不可用 | 显卡驱动或 PyTorch 版本问题 | 运行python -c "import torch; print(torch.cuda.is_available())" | 安装匹配 CUDA 版本的 PyTorch |
| 显存不足 | 模型过大或并发太高 | 用 nvidia-smi 查看显存 | 换量化模型、改小模型、降并发 |
| 端口被占用 | 默认 8000/7860 被其他服务占用 | 查看端口监听状态 | 修改 host / port |
| 批量任务卡住 | 单条推理阻塞或队列逻辑问题 | 查看任务日志与数据库 | 加超时重试,把队列改为异步处理 |
| 漏报编码混淆样本 | 预处理未做多重解码 | 检查解码函数 | 补充 URL 解码、HTML 实体解码、重复解码 |
| LLM 输出格式不稳定 | 提示词未约定输出格式 | 查看 LLM 原始返回 | 提示词要求 JSON 并做格式校验 |
| 启动很慢 | 加载大模型权重耗时 | 观察日志加载时间 | 改用量化模型或首次启动后保持服务常驻 |
排查时最重要的技巧是分级定位。先确认预处理输出是否正确,再看机器学习特征和得分是否合理,最后才怀疑 LLM 模块。不要一上来就改模型参数,先从日志和数据流找问题。
10. 最佳实践与使用建议
10.1 先跑通最小链路
拿到系统后,不要急着调参数、换模型。第一目标是用最小成本把“输入文本 -> 检测结果”这条链路跑通。配置固定下来后,再逐步增加样本类型。保留一套最小可运行配置,方便随时回滚。
10.2 目录与样本管理
训练样本、测试样本、模型权重、输出报告要分目录存放。建议这样组织:
data/ ├── raw/ # 原始样本 ├── processed/ # 预处理后特征 ├── models/ # 模型权重 └── results/ # 检测输出批量测试之前,先给样本编号,每个样本都带 source 字段。这样后面做误报率、召回率统计时有据可查。
10.3 接口服务注意访问范围
如果本地起的是 API 服务,并且监听了0.0.0.0,同一局域网的其他机器也能访问。毕业设计演示没问题,但要注意接口没有严格鉴权时,不要长期暴露在公网。演示完及时关掉服务,或者把 host 改回127.0.0.1。
10.4 答辩演示准备
答辩时最容易翻车的点不是算法,而是现场环境。建议准备三样东西:一是录一段本地演示视频,防止现场网络或硬件出问题;二是准备一批典型 Payload 和正常样本,测试用例提前跑过;三是把 LLM 的响应结果截图放到 PPT 里,用可视化内容展示“智能体如何解释攻击原理”。不要到了现场才现敲命令,风险太大。
10.5 关于论文和项目扩展
从论文写作角度看,可以重点展开三个点:一是特征工程,说明手动特征和机器学习特征如何组合;二是级联检测策略,说明为什么不能全链路都靠 LLM;三是实验对比,用相同测试集对比“规则/机器学习/规则+机器学习+LLM”三种方案的准确率和耗时。这样的实验设计在安全类毕设里很完整。
后续扩展可以考虑:接入本地靶场自动验证、增加存储型 XSS 的上下文分析、针对 XS-Leaks 等新型攻击做专项检测、把检测结果自动同步到飞书或邮件通知。
11. 总结与下一步
这个项目最值得尝试的地方,是它把“传统机器学习”和“大模型语义分析”放进了同一条检测链路,L LM 不再只是玩具级问答,而是作为边界样本的兜底判断器,同时负责生成人类可读的检测解释。从毕设角度看,这套选题有测试数据、有模块设计、有接口演示、有创新点,答辩时能讲的东西很多。
拿到项目后,建议最先验证三件事:第一,经典 XSS Payload 能不能稳定检出;第二,正常 HTML 会不会误报;第三,LLM 能否对混淆样本给出合理判断。这三条通了,项目的主干就已经成立。
最容易踩的坑集中在两个地方:一个是模型文件路径和 API Key 的配置问题,另一个是 LLM 输出格式不稳定导致下游解析报错。前者通过认真看 README 解决,后者通过提示词约束输出 JSON 解决。
后续如果想继续做深,可以把这套检测系统从“XSS 专项检测”扩展为“Web 常见漏洞智能检测”,把 SQL 注入、命令注入检测能力也加进流水线。模型层面也可以尝试用安全领域的开源指令模型做微调,让 LLM 更懂漏洞分析语境。这个方向既有研究空间,也有工程价值,值得持续跟下去。