Python漏洞扫描系统毕设实战:SQLi/XSS检测+数据库+演示

发布时间:2026/10/11 13:35:40
Python漏洞扫描系统毕设实战:SQLi/XSS检测+数据库+演示 简介本资源是一套完整的Python漏洞扫描系统毕业设计实现方案面向计算机专业本科生及网络安全初学者解决课程设计、毕设选题与基础渗透测试工具开发等实际需求。压缩包共541个文件包含26个核心Python源码文件py、67个前端交互脚本js、39个插件模块plugin、33个样式文件css以及79张界面截图png和2个演示视频mp4涵盖登录认证、端口扫描、结果可视化、扫描历史管理等完整功能模块整体大小为91.21MB。已有2979人学习下载资源提供可直接运行的MySQL数据库文件、详细操作演示视频、多层级HTML前端页面及LayuiBootstrap双框架前端资源配合nikto等安全工具集成配置便于理解漏洞扫描原理、掌握前后端协同开发流程并快速部署调试。1. 这不是玩具级扫描器一个能跑通SQL注入XSS检测、带真实数据库和交互式演示的毕业设计级Python漏洞扫描系统你手头正赶着毕设 deadline导师说“得有真实数据支撑、能跑起来、最好还能演示”但网上搜到的所谓“Python漏洞扫描系统”不是只有半页代码的伪项目就是拿 requests 正则硬怼的 demo连个基础的 SQLi payload 分类都做不全更别说数据库持久化扫描记录、生成报告、甚至带前端演示视频——这种项目答辩时一问就露馅。而这份「毕业设计-基于Python漏洞扫描系统毕业设计与实现源码数据库演示视频」是真正按软件工程闭环走完的完整交付物它用 Flask 搭 Web 界面SQLite 存扫描任务与结果内置 3 类核心漏洞检测模块SQL注入、反射型 XSS、目录遍历支持 URL 批量导入、手动触发扫描、结果导出 CSV并附带实机录屏演示视频非 PPT 动画。它不追求商业级 WAF 绕过能力但每行代码可调试、每个检测逻辑可验证、每条扫描记录可回溯——适合本科生做毕设答辩、课程设计复现、安全入门者理解漏洞检测底层逻辑。如果你需要的是“能讲清楚原理、能现场跑通、能写进论文方法论章节”的 Python 安全工具而不是“名字很炫、打开就报错”的压缩包那这份资源就是你该停下来的那个。2. 从解压到跑通环境准备、数据库初始化与 Web 服务启动三步落地2.1 环境依赖与 Python 版本确认为什么必须用 3.83.10项目源码中requirements.txt明确列出依赖项但实际运行时发现sqlalchemy1.4.46与flask-sqlalchemy3.0.5存在兼容性边界。我本地测试过 Python 3.7报AttributeError: module sqlalchemy has no attribute orm、3.11flask-wtf的CSRFToken初始化失败最终稳定运行版本锁定在Python 3.9.18推荐使用pyenv或conda隔离环境。不要图省事用系统默认 Python尤其 Windows 用户常自带 3.11直接 pip install 会卡在sqlalchemy编译阶段。# 推荐创建独立虚拟环境Linux/macOS python3.9 -m venv vulnscan_env source vulnscan_env/bin/activate pip install --upgrade pip pip install -r requirements.txt提示requirements.txt中pymysql是冗余项项目用 SQLite未启用 MySQL 支持可注释掉避免安装失败若提示cryptography编译错误先pip install --only-binaryall cryptography。2.2 数据库初始化不只是建表而是预置测试数据与状态字段项目根目录下database/文件夹含vulnscan.db初始文件但直接运行会因 schema 不匹配报错。正确做法是删除该文件让 Flask 自动重建——因为源码中models.py定义了完整的 ORM 模型且app.py启动时调用db.create_all()。关键字段设计如下表名字段说明是否必填scan_tasksid,target_url,status,created_at,finished_at任务主表status为pending/running/completed/failed是scan_resultsid,task_id,vuln_type,payload,response_snippet,confidence结果明细confidence为 13 级1疑似3高置信是vuln_rulesid,vuln_type,payload_template,detection_pattern规则库如 XSS 使用script正则匹配响应体是执行初始化命令后你会看到instance/vulnscan.db自动生成注意路径不是根目录下的database/这是 Flask 默认的 SQLite 存储位置。2.3 启动 Web 服务并验证端口连通性别只看 Running on http://127.0.0.1:5000启动命令看似简单cd src python app.py但实际常卡在* Running on http://127.0.0.1:5000却打不开页面。原因有三防火墙拦截Windows Defender 防火墙默认阻止 Python 进程监听 5000 端口需手动放行端口占用VS Code Live Server、其他 Flask 项目可能占用了 5000改端口app.run(host0.0.0.0, port8080, debugTrue)静态资源路径错误templates/和static/必须与app.py同级否则 CSS/JS 加载 404页面白屏——检查app.py中template_foldertemplates路径是否相对正确。成功启动后访问http://127.0.0.1:8080应看到蓝色主题的扫描首页含「单URL扫描」「批量导入」「历史记录」三个 Tab这才是真正可交互的入口。3. 核心检测逻辑拆解SQL注入/XSS/目录遍历三大模块如何协同工作3.1 SQL注入检测不是盲扫而是分层验证的三段式判断系统对 SQLi 的检测并非简单拼接 OR 11--就完事而是采用请求-响应-上下文三级验证探测层发送 4 类 payload,,),))观察 HTTP 状态码是否突变为 500/400确认层对疑似目标再发布尔型 payload AND 11--, AND 12--比对响应体长度差异 15 字节证据层提取响应中 MySQL/PostgreSQL 错误关键词MySQL error,syntax error near写入response_snippet字段。关键代码在scanner/sql_inject.py的check_sql_injection()函数def check_sql_injection(url): payloads [, \, )] for p in payloads: try: r requests.get(f{url}{p}, timeout5) if r.status_code in [500, 400]: # 进入布尔验证 r1 requests.get(f{url} AND 11--, timeout5) r2 requests.get(f{url} AND 12--, timeout5) if abs(len(r1.text) - len(r2.text)) 15: return True, fSQL error: {r.status_code} except Exception as e: continue return False, 注意timeout5是硬性要求避免单个 URL 卡死整个扫描队列abs(len(r1.text) - len(r2.text)) 15是经验值太小易误报如广告 JS 变动太大漏报WAF 返回固定长度页面。3.2 XSS 检测聚焦反射型规避 DOM 型黑匣子陷阱项目明确限定为反射型 XSS即 payload 通过 URL 参数传入、服务端原样返回不处理 DOM 型需浏览器 JS 执行环境。检测逻辑分两步Payload 注入对 URL 中每个参数值替换为scriptalert(1)/script或更隐蔽的img srcx onerroralert(1)响应匹配正则搜索(script|img|iframe).*?on\w.*?alert且要求匹配内容在 HTTP 响应体中未被 HTML 实体编码即未转成lt;。scanner/xss_scan.py中关键判断def detect_reflected_xss(url): parsed urlparse(url) params parse_qs(parsed.query) for key, values in params.items(): for val in values: # 构造带 payload 的新 URL new_query parsed.query.replace(f{key}{val}, f{key}scriptalert(1)/script) test_url urlunparse((parsed.scheme, parsed.netloc, parsed.path, , new_query, )) try: r requests.get(test_url, timeout5) # 检查原始 payload 是否未编码出现在响应中 if bscriptalert(1)/script in r.content and blt;scriptgt; not in r.content: return True, Reflected XSS confirmed except: pass return False, 提示此逻辑无法检测 CSP 严格策略下的 XSS但毕设场景中多数靶机未配 CSP属合理取舍。3.3 目录遍历检测用路径归一化绕过基础过滤针对../过滤系统采用双重编码与路径归一化组合技发送..%2f..%2fetc%2fpasswdURL 编码发送....//....//etc/passwd多点混淆服务端收到后用os.path.normpath()归一化路径再判断是否越界如/etc/passwd不在 Web 根目录下。scanner/dir_traversal.py中核心校验def is_path_traversal_vulnerable(url): payloads [ ..%2f..%2fetc%2fpasswd, ....//....//etc/passwd, %2e%2e%2f%2e%2e%2fetc%2fpasswd ] for p in payloads: test_url f{url.rstrip(/)}/{p} try: r requests.get(test_url, timeout5) if root:x:0:0: in r.text or bin:x:1:1: in r.text: return True, Directory traversal confirmed except: pass return False, 注意r.text用于文本匹配但某些 Linux 文件返回二进制如/etc/shadow此时需用r.content并decode(utf-8, errorsignore)处理。4. 避坑指南答辩前必须绕开的 5 个血泪雷区4.1 现象扫描任务状态卡在 pending数据库里finished_at为空原因app.py中scan_task函数调用threading.Thread启动扫描但主线程未等待子线程结束导致任务对象未更新状态。更致命的是Flask 默认不支持多线程写数据库db.session.commit()在子线程中失效。解决将扫描逻辑改为协程asyncio或使用ThreadPoolExecutor管理线程并在子线程内重新创建db.session。修改app.py中start_scan()from concurrent.futures import ThreadPoolExecutor executor ThreadPoolExecutor(max_workers2) def run_scan_in_thread(task_id): task ScanTask.query.get(task_id) # 重新获取 session关键 from app import db db.session db.create_scoped_session() # ... 执行扫描逻辑 ... task.status completed db.session.commit() app.route(/scan, methods[POST]) def start_scan(): # ... 创建 task ... executor.submit(run_scan_in_thread, task.id) return jsonify({status: started})4.2 现象XSS 扫描结果全是 False但手工验证靶站确实存在漏洞原因靶站对script标签做了输出过滤但未过滤img srcx onerroralert(1)而代码中只检测alert(1)字符串未覆盖事件处理器。解决扩展 payload 列表在xss_scan.py中增加xss_payloads [ scriptalert(1)/script, img srcx onerroralert(1), svg/onloadalert(1), javascript:alert(1) ]并同步更新正则匹配逻辑支持onerror和onload事件。4.3 现象批量导入 CSV 后部分 URL 扫描失败日志显示 Invalid URL原因CSV 中 URL 缺少协议头如example.com而非http://example.comrequests.get()报MissingSchema异常但异常被静默吞掉。解决在utils/url_validator.py中添加协议补全逻辑def normalize_url(url): if not url.startswith((http://, https://)): url http:// url return url并在导入时调用normalized_urls [normalize_url(u.strip()) for u in urls]。4.4 现象演示视频里点击 生成报告 导出 CSV但本地生成文件为空原因report_generator.py中csv.writer未指定newline参数导致 Windows 下换行符为\r\n\r\nExcel 打开显示空行。解决修改文件写入方式with open(filename, w, newline) as f: # 关键newline writer csv.writer(f) writer.writerow([URL, Vuln Type, Payload]) for r in results: writer.writerow([r.target_url, r.vuln_type, r.payload])4.5 现象SQLite 数据库文件被锁重启服务时报 database is locked原因扫描过程中频繁读写vulnscan.db而 SQLite 默认 WAL 模式未开启多线程并发写入冲突。解决在app.py初始化数据库后添加app.before_first_request def init_db(): db.create_all() # 启用 WAL 模式提升并发写性能 db.session.execute(PRAGMA journal_modeWAL) db.session.commit()5. 毕设答辩加分技巧三招让评委眼前一亮的定制化改造5.1 给扫描结果加「漏洞等级评分」用置信度 × 影响面量化风险单纯标记 SQLi 或 XSS 不够专业。我在scan_results表中新增risk_score字段FLOAT按公式计算risk_score confidence * impact_factor其中confidence来自检测模块13impact_factor由漏洞类型决定SQLi3.0XSS2.5DirTraversal2.0。这样同一页面扫出 2 个 XSS置信度2和 1 个 SQLi置信度3总分 2×2.5 1×3.0 8.0比单纯罗列更体现风险意识。# 在 scanner/base.py 的 scan_result() 方法中 def save_result(task_id, vuln_type, payload, snippet, confidence): impact_map {sql_injection: 3.0, xss: 2.5, dir_traversal: 2.0} risk_score confidence * impact_map.get(vuln_type, 1.0) result ScanResult( task_idtask_id, vuln_typevuln_type, payloadpayload, response_snippetsnippet[:200], # 截断防超长 confidenceconfidence, risk_scorerisk_score ) db.session.add(result) db.session.commit()前端在历史记录页增加「风险总分」排序按钮答辩时可演示“这个网站风险分 12.5远高于平均值 4.2建议优先修复”。5.2 插入「人工验证开关」让评委亲手点按钮确认漏洞真实性答辩最怕被问“你怎么证明这不是误报”。我在扫描结果页加了一个「人工验证」按钮点击后自动用 Chrome 打开靶站 URL 并填充 payload需提前配置CHROMEDRIVER_PATH# utils/manual_verify.py from selenium import webdriver from selenium.webdriver.common.by import By def verify_xss_in_browser(url, payload): options webdriver.ChromeOptions() options.add_argument(--headless) driver webdriver.Chrome(optionsoptions) try: # 构造带 payload 的 URL parsed urlparse(url) query parsed.query ftest{payload} test_url urlunparse((parsed.scheme, parsed.netloc, parsed.path, , query, )) driver.get(test_url) # 检查 alert 是否弹出需配合靶站 JS WebDriverWait(driver, 3).until(EC.alert_is_present()) return True except: return False finally: driver.quit()注意此功能需评委电脑装 Chrome 和 chromedriver演示前务必测试——我曾因 chromedriver 版本不匹配在答辩现场反复重装 3 次从此养成了「演示机单独打包驱动」的习惯。5.3 生成「漏洞修复建议」Markdown 报告把技术语言翻译成运维能懂的话report_generator.py不再只导出 CSV而是生成report_20240515.md含问题定位GET /search?qscriptalert(1)/script→ 响应中返回未过滤的 script 标签修复方案PHPhtmlspecialchars($_GET[q], ENT_QUOTES, UTF-8)Python Flask{{ request.args.get(q) | escape }}JavaStringEscapeUtils.escapeHtml4(q)验证方法访问http://target/search?q%3Cscript%3Ealert(1)%3C/script%3E确认返回内容为lt;scriptgt;alert(1)lt;/scriptgt;def generate_markdown_report(results): md # 漏洞扫描报告\n\n for r in results: md f## {r.vuln_type.upper()} ({r.confidence}/3)\n md f- **URL**: {r.target_url}\n md f- **Payload**: {r.payload}\n md f- **修复建议**:\n if r.vuln_type xss: md - 对用户输入进行 HTML 实体编码\n md - 设置 Content-Security-Policy 头\n elif r.vuln_type sql_injection: md - 使用参数化查询Prepared Statement\n md - 禁用动态拼接 SQL 字符串\n return md从那以后我每次做毕设演示都会把report_20240515.md打印成 A4 纸放在评委面前——不是为了炫技而是让「安全」这件事从代码里的if r.status_code 500:变成纸上一句能落地的请在 login.php 第 42 行加 htmlspecialchars()。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询