2026/2/19 16:24:11
网站建设
项目流程
北京朝阳区做网站,wordpress quform下载,江西赣建建设监理网站,榆次做网站背景痛点#xff1a;毕设场景下的“祖传”扫描器为何难用
做毕设选 Web 漏洞扫描器#xff0c;听起来高大上#xff0c;真动手才发现传统开源工具#xff08;w3af、OpenVAS、Nikto 等#xff09;在本科阶段几乎跑不通#xff1a;
规则库动辄上万条#xff0c;Git LFS …背景痛点毕设场景下的“祖传”扫描器为何难用做毕设选 Web 漏洞扫描器听起来高大上真动手才发现传统开源工具w3af、OpenVAS、Nikto 等在本科阶段几乎跑不通规则库动辄上万条Git LFS 拉取就掉线笔记本硬盘直接告急。误报高到怀疑人生一个「X-Powered-By」头没擦直接报 20 条「信息泄露」答辩时老师一句「你确定这是漏洞」就卡壳。插件语言百花齐放C、Lua、Python2.7毕设周期只有 3 个月光配环境就过去一半时间。最致命规则硬编码一旦目标站把登录口从/login.php改成/sign/in扫描器直接失明而本科毕设不可能让你写几千条正则去“兜底”。于是把希望寄托在「AI 辅助」——让大模型做苦力我负责架构与验证这才有了下面的实战记录。技术选型对比规则引擎 vs. LLM 辅助决策维度传统规则引擎LLM 辅助决策维护成本新增漏洞需人工写正则、插件周期长改 prompt 即可分钟级迭代误报率高依赖白名单过滤中等可要求模型“给出理由置信度”漏报率高规则未覆盖就跳过低模型可泛化到未见过的模式执行性能毫秒级秒级GPU 预热甚至 10s离线场景完全可离线7B 模型可 CPU 跑但需 6G 内存可解释性正则即证据老师看得懂自然语言推理需额外落库留痕结论毕设不是商业项目「能跑能改能讲清楚」优于「极致性能」。因此采用「混合架构」用规则做「高频低危」快速过滤如 robots.txt 泄露用 LLM 做「低频高危」研判如存储型 XSS、SQL 注入的语义确认核心实现Python Playwright 动态爬虫 × 开源 LLM系统架构图1. 动态爬虫模块crawler.py职责渲染 SPA、自动填表、维护 Cookie 池输出「请求-响应」对给下游。关键实现点每个页面最大深度 3防止无限递归相同 URL 仅爬一次幂等靠page.url postData 的哈希全局请求拦截器统一打时间戳方便后续限速import asyncio, hashlib, json from playwright.async_api import async_playwright class DeepCrawler: def __init__(self, max_depth3, max_pages200): self.visited set() self.max_depth max_depth self.max_pages max_pages async def crawl(self, entry: str): async with async_playwright() as p: browser await p.chromium.launch(headlessTrue) page await browser.new_page() await self._dfs(page, entry, depth0) await browser.close() async def _dfs(self, page, url, depth): if depth self.max_depth or len(self.visited) self.max_pages: return key self._url_key(url, await page.content()) if key in self.visited: return self.visited.add(key) # 真正发出请求 await page.goto(url, wait_untilnetworkidle) # 收集表单 forms await page.locator(form).element_handles() for form in forms: await self._handle_form(page, form, depth) def _url_key(self, url, body): return hashlib.sha256(f{url}{body[:500]}.encode()).hexdigest()幂等性说明_url_key把 URL 与响应前 500 字节一起做摘要确保重复跳转不会二次入库。2. LLM 客户端llm_gate.py采用 Llama.cpp 7B-chat 量化版本地 CPU 可跑延迟 2~3 秒。职责payload 生成给定参数名、类型让模型「脑补」攻击向量响应研判把响应体切片喂给模型要求输出「是否漏洞理由置信度 0-1」from llama_cpp import Llama class LlamaGate: def __init__(self, model_path: str, n_ctx4096): self.llm Llama(model_pathmodel_path, n_ctxn_ctx, logits_allFalse) def prompt_payload(self, param: str, context: str) - list[str]: tpl fBelow is a web form parameter {param} in context: {context} List 5 classic payloads for testing XSS or SQLi. No explanation. output self.llm(tpl, max_tokens200, temperature0.8) return [p for p in output[choices][0][text].split(\n) if p] def judge(self, payload: str, response_snippet: str) - tuple[bool, str, float]: tpl fPayload: {payload} Response snippet: {response_snippet} Is the above response indicating a successful XSS or SQLi? Answer JSON only: {{vuln: boolean, reason: ..., confidence: 0.0-1.0}} out self.llm(tpl, max_tokens120, temperature0.1) try: obj json.loads(out[choices][0][text]) return obj[vuln], obj[reason], obj[confidence] except Exception as e: # 模型偶尔输出非 JSON保守返回 return False, fparse error: {e}, 0.0错误处理解析失败即视为无漏洞宁可漏报也不误报符合毕设「演示优先」原则。3. 扫描调度器scanner.py把上面两个模块串起来并加入速率限制、敏感字段脱敏。import asyncio, re, time from crawler import DeepCrawler from llm_gate import LlamaGate class AIDrivenScanner: def __init__(self, llm: LlamaGate, rps5): self.llm llm self.rps rps self.last_req 0 async def scan(self, target: str): crawler DeepCrawler() await crawler.crawl(target) for req_resp in crawler.collected: await self._test_with_ai(req_resp) async def _test_with_ai(self, rr: dict): # 速率控制 gap 1 / self.rps await asyncio.sleep(max(0, gap - (time.time() - self.last_req))) self.last_req time.time() # 脱敏把手机号、邮箱替换成占位符 body self._desensitize(rr[response_body]) for param in rr[params]: payloads self.llm.prompt_payload(param, rr[context]) for p in payloads: vuln, reason, conf self.llm.judge(p, body[:1500]) if vuln and conf 0.7: print(f[VULN] param{param} payload{p} reason{reason}) def _desensitize(self, text: str) - str: text re.sub(r\b1[3-9]\d{9}\b, PHONE, text) text re.sub(r\b[\w.-][\w.-]\.\w\b, EMAIL, text) return textClean Code 要点函数不超过 30 行一眼看完幂等多次调用_test_with_ai不会重复插入漏洞去重 key 由 crawler 保证错误隔离LLM 抛异常只丢单条 payload主流程继续安全性与性能考量请求频率默认 RPS5可在路由器层再套令牌桶防止把靶站打挂。敏感信息脱敏日志、prompt 里一旦出现身份证、手机号直接掩码防止「扫描器本身成为泄露源」。模型冷启动优化Llama.cpp 支持mmap首次加载 3.8 GB 模型需 8-10 秒在毕设演示前先把进程常驻用unix socket做守护避免老师点按钮后空等。内存控制7B 模型在 0.5 量化后约 3.8 GB再留 1 GB 给 Playwright8 GB 笔记本刚好跑得动若目标站过大可关浏览器多进程--single-process省 30% 内存。超时与重试Playwright 默认 30 秒网络空闲遇到大文件下载会卡在page.goto加timeout10 000并捕获TimeoutError重试一次即可。生产环境避坑指南别问为什么强调踩过过度依赖 AI 导致漏报LLM 对「时间盲注」这类延迟响应无感务必保留传统sleep()检测链。输出不可控模型可能返回「我认为这是漏洞」但置信度 0.51答辩时被老师追问「依据呢」——务必把reason落库并展示原始响应片段人工复核。法律红线扫描公网需授权毕设靶场建议用 Vulhub 或自建 Docker 镜像日志里若记录真实学生手机号属于「个人信息处理」需做匿名化。GPU 云主机费用AutoDL 按量 1.4 元/小时演示 10 分钟花 2 元可接受但切记关机否则通宵跑 30 块就没了。可改进方向 留给读者的思考题payload 生成策略目前靠「无脑枚举」能否让 LLM 先读 OpenAPI 文档再针对性生成符合字段语义的攻击向量如何把「自动化」与「人工验证」量化平衡例如设定业务阈值置信度0.9 自动报 bug0.7-0.9 发企业微信待人工点确认0.7 直接丢弃。响应体过大时先让模型读摘要html2text 后 2 000 字符再逐步放大窗口能否在保持精度的同时降低延迟动手改一改你会发现毕设不止「能跑」还能「讲出故事」。祝你答辩顺利也欢迎把改进后的 prompt 和代码回馈到社区一起把 AI 辅助安全做得更靠谱。