新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于Django和Vue3的Web入侵检测扫描工具构建实践

发布时间:2026/10/1 12:41:24来源:尧图网络
基于Django和Vue3的Web入侵检测扫描工具构建实践
前一阵子我接到一个Web入侵检测扫描工具的研发任务需求文档技术栈那栏写得很壮观——PHP、ASP.NET、Java、Springboot、SSM、Vue3排了一整行末尾还补了一句“技术栈可以再议优先保证功能落地”。看到这个备注我就明白了需求方真正要的是一套能跑起来的Web化入侵检测工具最开始的描述更像是一份“候选清单”把市面上能叫得上名的Web框架都列了一遍。最终我选择了Django Vue3的技术组合完成整套工具的设计与实现今天就把这大几个月的调研、选型、编码和踩坑过程完整复盘一遍给正在做安全工具、毕业设计或者企业安全自检平台的同学一个可参考的路线图。这个工具具体能做什么通过Web界面发起扫描任务对目标站点做端口探测、服务指纹识别、漏洞特征匹配同时支持导入访问日志做攻击行为检测识别SQL注入、XSS、路径穿越、暴力破解等常见入侵行为检测结果分严重级别入库并通过WebSocket实时推送到前端可视化面板。逻辑上分成了“扫描引擎”和“检测分析”两条线最终把结果汇总成一份直观的风险报告。1. 项目定位与技术选型复盘1.1 先把需求拆明白这个工具到底要做什么“Web入侵检测扫描工具”这个名称包含两个关键词入侵检测和扫描。工具形态是Web化的也就是用户通过浏览器操作不依赖命令行。我把需求拆成了四层。第一层是资产探测对目标域名或IP做基础信息收集包括开放端口、运行服务、Web框架组件版本这是所有扫描动作的前提因为连目标跑的是什么都不知道规则匹配无从谈起。第二层是脆弱性检测基于规则库匹配已知漏洞特征和错误配置比如暴露的管理后台、敏感文件泄露、无防护的登录接口、带版本号的框架组件等。第三层是攻击行为识别分析访问日志或实时请求找出SQL注入尝试、XSS注入、路径穿越、暴力破解等攻击痕迹。第四层是管理和呈现包含任务管理、告警推送、结果可视化、报告导出。这里要特别注意入侵检测和扫描在实现上共享了大量底层能力。规则引擎是同一个数据模型是同一套只是一个偏“主动伸手去探测”一个偏“被动蹲在日志里看”。设计时如果把它们拆成两套割裂的系统后面维护规则会非常痛苦。所以我从一开始就把规则库做成统一中心扫描检测和分析检测都去引用它。1.2 为什么最终选了Django而不是Springboot、SSM或PHP需求方列出的技术栈里有Springboot、SSM、PHP、ASP.NET和Vue3这其实是很多项目初期的常态老板或者客户把平时听过的技术名词全部塞进需求文档真正拍板靠的是研发人员的实测对比。先看Java系。Springboot和SSM都很成熟类型安全适合大型团队协作。但我当时反复权衡的一个问题是迭代节奏。安全工具最重要的资产是规则库规则要频繁增删改。用Java写规则匹配每次改一条正则逻辑都要走编译、打包、发版流程开发一小时发版跑半天这个节奏在安全应急场景下太难受了。网上有一个很火的搜索词叫“怎么将Springboot jar反编译成项目”侧面反映了很多Java项目交付之后修改困难的问题这对工具类项目来说是个实实在在的痛点。再看PHP和ASP.NET。PHP上手快做内容型网站很合适但要实现异步扫描任务、WebSocket推送、ORM模型管理这些现代Web应用的基础能力生态相对分散工程质量不好保证。ASP.NET企业级能力很强但团队熟悉度不够跨平台部署也没那么轻量。对比下来Django的优势非常具体。第一Python在安全领域的生态几乎是统治级的网络请求、正则处理、文本解析、数据清洗这些安全检测高频操作Python写起来效率极高。第二Django自带Admin后台规则库维护、任务状态查看、用户管理这些管理功能几乎零成本实现运营人员不需要写代码就能维护检测规则。第三Django ORM配DRF前后端分离接口开发速度极快。第四Django Channels对WebSocket有官方支持正好满足“后台一有数据前端实时推送”的场景。我实际对比过Springboot和Django的原型开发速度。同样是做一个扫描任务的增删改查加状态流转Springboot从建工程到引入MyBatis-Plus、配数据源、写Mapper再写Service大概要半天Django这边用startapp生成模块ORM建两张表DRF序列化器一写两个小时就能出接口。对于安全工具这种“规则驱动、快速迭代”的项目Django的胜出几乎是必然。1.3 前端为什么锁定Vue3前端选型其实比后端简单。需求方明确写了Vue3我也认可这个选择。Vue3的组合式API对复杂交互面板特别友好扫描结果展示包含任务列表、实时进度条、风险分布图、告警流这些逻辑用setup函数组织起来比Vue2的选项式API清晰得多。Vite构建工具的热更新速度也确实快前端调试体验比Webpack时代好一个档次。另外ECharts对Vue3的支持很成熟风险趋势图、饼图、IP地理分布图这些可视化组件可以直接封装复用。团队如果后续接手Vue的中文文档和社区资料足够丰富上手门槛比React低。2. 系统架构设计与数据流2.1 Django项目的目录结构与app划分项目名我起了一个很直白的名字webidsWeb Intrusion Detection System。Django创建一个新项目的命令是django-admin startproject webids cd webids python manage.py startapp scanner python manage.py startapp detector python manage.py startapp notification python manage.py startapp dashboard python manage.py startapp accounts一开始就规划好app边界后面开发会省很多事。scanner负责主动扫描包括端口探测、指纹识别、漏洞规则匹配detector负责被动检测解析日志、聚合分析攻击行为notification负责告警推送WebSocket和将来可能的邮件通知都放这里dashboard负责聚合数据提供API给前端accounts管用户认证。目录结构最终长这样webids/ ├── manage.py ├── webids/ │ ├── settings.py │ ├── urls.py │ ├── asgi.py │ └── celery.py ├── scanner/ │ ├── models.py │ ├── tasks.py │ ├── nmap_utils.py │ └── fingerprint.py ├── detector/ │ ├── models.py │ ├── rules.py │ ├── parser.py │ └── tasks.py ├── notification/ │ ├── consumers.py │ └── routing.py ├── dashboard/ │ └── views.py ├── accounts/ │ └── models.py └── frontend/ ├── src/ └── vite.config.ts把前端项目直接放在Django工程目录下部署时一个仓库管理构建产物由Nginx统一托管逻辑上很顺。2.2 扫描任务调度Celery让长任务跑在后台如果扫描动作同步执行一次完整的端口扫描加上规则匹配可能要跑几分钟HTTP请求早超时了。所以任务调度必须异步化。我选的是Celery Redis的方案这也是Python后端最经典的组合。# webids/celery.py import os from celery import Celery os.environ.setdefault(DJANGO_SETTINGS_MODULE, webids.settings) app Celery(webids) app.config_from_object(django.conf:settings, namespaceCELERY) app.autodiscover_tasks()settings里只需要配置两行CELERY_BROKER_URL redis://127.0.0.1:6379/0 CELERY_RESULT_BACKEND redis://127.0.0.1:6379/0整个任务流是这样的前端点“发起扫描” - Django API创建ScanTask记录状态置为pending - Celery任务开始执行 - 扫描过程中不断回调更新任务进度和中间结果 - 全部完成之后任务状态置为completed同时向WebSocket推送完成事件。用Celery还有个额外好处失败重试机制是内置的。比如目标网站临时不可达导致指纹识别超时我可以给任务加autoretry_for(TimeoutError,)重试两次极大减少手动重新扫码的频次。2.3 WebSocket实时推送后台一有数据前端立刻知道Django默认的HTTP模型是请求-响应服务端没法主动给前端发消息。但“扫描进度实时刷新”“发现新的攻击告警弹出来”这两个需求天然需要服务端主动推送。Django Channels是官方推荐的解决方案。配置分几步走# settings.py INSTALLED_APPS [ # ... channels, ] ASGI_APPLICATION webids.asgi.application CHANNEL_LAYERS { default: { BACKEND: channels_redis.core.RedisChannelLayer, CONFIG: {hosts: [(127.0.0.1, 6379)]}, } }asgi.py也要改一下# webids/asgi.py import os from django.core.asgi import get_asgi_application from channels.routing import ProtocolTypeRouter, URLRouter from notification.routing import websocket_urlpatterns os.environ.setdefault(DJANGO_SETTINGS_MODULE, webids.settings) application ProtocolTypeRouter({ http: get_asgi_application(), websocket: URLRouter(websocket_urlpatterns), })consumer的核心逻辑长这样# notification/consumers.py import json from channels.generic.websocket import AsyncWebsocketConsumer class ScanProgressConsumer(AsyncWebsocketConsumer): async def connect(self): self.scan_id self.scope[url_route][kwargs][scan_id] self.group_name fscan_{self.scan_id} await self.channel_layer.group_add(self.group_name, self.channel_name) await self.accept() async def disconnect(self, close_code): await self.channel_layer.group_discard(self.group_name, self.channel_name) async def scan_message(self, event): await self.send(text_datajson.dumps(event[data]))这样设计事件协议非常关键。我定义了三类消息progress进度百分比和当前检测项、alert新的告警事件、complete任务完成汇总。前端根据消息类型分别更新进度条、弹告警提示、跳转报告页。后续不管是发邮件还是存数据库都往这个group里发一份消费者只是展示层逻辑不会被绑死。前端Vue3这边连接WebSocket的代码也不复杂const ws new WebSocket(ws://${location.host}/ws/scan/${scanId}/) ws.onmessage (event) { const data JSON.parse(event.data) if (data.type progress) { progress.value data.percent } else if (data.type alert) { alerts.unshift(data.item) } }这套结构跑起来之后体验非常直观后端每检测完一个端口、命中一条规则前端页面就实时动一下和那些只有“扫描中”转圈等到最后的工具完全两个感受。3. 核心模块实现从规则到扫描再到展示3.1 检测规则库扫描工具的“大脑”规则库是整个工具的核心资产我把它设计成一张数据库表加一个YAML导入导出机制。模型长这样# detector/models.py from django.db import models class Rule(models.Model): CATEGORY_CHOICES [ (sqli, SQL注入), (xss, XSS跨站脚本), (path_traversal, 路径穿越), (cmd_injection, 命令注入), (info_leak, 信息泄露), (misconfig, 错误配置), ] name models.CharField(max_length128, uniqueTrue) category models.CharField(max_length32, choicesCATEGORY_CHOICES) severity models.CharField(max_length16, defaultmedium) pattern models.TextField(help_text正则表达式匹配即命中) description models.TextField() remediation models.TextField(help_text修复建议) is_active models.BooleanField(defaultTrue) created_at models.DateTimeField(auto_now_addTrue)这条规则表同时服务扫描引擎和日志检测引擎。扫描引擎拿它去匹配响应内容检测引擎拿它去匹配日志文本。Django ORM做规则查询和管理都非常顺手比如查询所有高风险规则high_risk_rules Rule.objects.filter(severityhigh, is_activeTrue)禁用某条误报率高的规则Rule.objects.filter(nameexample_rule).update(is_activeFalse)或者直接删除对象Rule.objects.filter(nameoutdated_rule).delete()这里有个很重要的设计细节每条规则的正则表达式统一用预编译缓存不要每次匹配都重新编译。我封装了一个模块级缓存import re from functools import lru_cache lru_cache(maxsize512) def get_compiled_pattern(pattern_text: str): return re.compile(pattern_text, re.IGNORECASE)扫描一个目标可能要跑上百条规则不用缓存的话光是编译正则的开销就能吃掉一半时间。规则的管理界面我直接用了Django Admin运营人员登录后台就能增删改查规则不需要为规则管理单独写一套前端页面。上线后维护成本趋近于零。规则格式还支持YAML导入方便从外部安全情报源批量导入检测特征。3.2 端口探测与服务指纹识别扫描的第一步是看看目标开放了哪些端口。这部分我用了python-nmap它是对Nmap的封装能在Python里直接拿到扫描结果# scanner/nmap_utils.py import nmap def scan_ports(host: str, ports: str 1-1024): nm nmap.PortScanner() nm.scan(host, ports, arguments-sS -T4 --open) results {} for port in nm[host][tcp]: state nm[host][tcp][port][state] if state open: results[port] nm[host][tcp][port].get(name, unknown) return results只扫1到1024端口作为默认选项是因为全端口扫描太慢一次扫6万多个端口用户体验很差。后续需要更深度的扫描时再开放全端口扫描选项。端口拿到之后是服务指纹识别。指纹识别的原理不复杂每个Web框架或者中间件都有独特的响应头、页面关键字、静态资源路径。比如某个框架的登录页固定包含一段版权声明某个中间件会在Server头里暴露自己的名字。我建了一张指纹表和一个匹配逻辑# scanner/fingerprint.py FINGERPRINTS { thinkphp: [X-Powered-By: ThinkPHP, /Public/static/], springboot: [Whitelabel Error Page, X-Application-Context], nginx: [Server: nginx], apache: [Server: Apache], django: [csrftoken, Server: WSGIServer], }具体实现时用requests带超时和证书忽略去请求目标首页然后把响应头和响应体喂给指纹匹配器。匹配到指纹后把组件名和版本写进ScanResult表同时联动规则库——如果组件版本命中了某个已知漏洞特征立刻生成一条high级别的告警。这里有个小技巧请求超时设短一点比如5秒并且加一个重试机制因为有些老旧站点响应很慢超时设太短会把正常站点误判为不可达。3.3 攻击行为检测与日志分析扫描解决的是“主动探测”攻击行为检测解决的是“被动识别”。常见的数据来源有两个一个是Web服务器访问日志一个是前面扫描阶段拿到的请求响应数据。我在detector模块里写了一个日志解析器支持Nginx和Apache的默认日志格式。检测的核心就是正则规则匹配。比如SQL注入的日志特征常见的错误关键字是“SQL syntax error”和“mysql_fetch_array”注入尝试的特征是“union select”和“or 11”这类模式出现在URL参数里。XSS的特征是script标签出现在请求参数中。路径穿越的特征是URL里出现多个../。但纯单条日志匹配很容易误报。我加了三个缓解手段。第一是白名单机制把内网IP和已知爬虫UA加白名单来源是白名单的请求不做告警。第二是阈值机制单条日志命中规则只记低危事件同一个IP命中相同规则超过阈值比如10次才升级为高危告警。第三是聚合分析用Django ORM对日志表做分组统计from django.db.models import Count suspect_ips ( LogEntry.objects .filter(is_attackTrue, time__gtestart_time) .values(source_ip) .annotate(totalCount(id)) .filter(total__gte10) .order_by(-total) )暴力破解检测就是典型的聚合场景。单次登录失败没什么好奇怪的但某个IP在5分钟内对登录接口请求了50次且大量返回401基本可以断定在爆破。这种聚合分析用ORM写非常快而且直接走数据库索引不会占用Python进程内存。3.4 Vue3可视化面板把扫描结果变成看得懂的报告前端项目我用Vite初始化组合式API开发。初始化命令npm create vuelatest后面安装的依赖就几个axios做HTTP请求pinia做全局状态echarts做图表。TypeScript选项建议打开后面维护接口类型定义会轻松很多。页面结构分四块任务中心、扫描详情、告警大屏、规则管理。任务中心是表格页展示历史扫描任务状态标签分pending、running、completed、failed四种点“详情”跳转到扫描详情页。扫描详情页最核心的是实时进度条和结果列表。进度条数据来自WebSocket消息结果列表是DRF接口返回的检测结果。告警大屏是展示面最炫的部分左边是告警时间线中间是风险等级分布饼图右边是规则命中Top10排行所有图表在收到WebSocket的alert消息时实时更新。ECharts更新数据的写法要注意不要每次setOption传整个配置对象只传变化的data部分chartRef.value.setOption({ series: [{ data: newData }] })这样图表不会闪动画也顺滑。我用ref来保存图表实例在onMounted里初始化在onUnmounted里dispose避免组件销毁后实例泄漏。API请求封装上我做了两件事。请求拦截器在headers里带token响应拦截器统一处理错误码和401跳转登录。token的存储我选的是localStorageDjango侧负责签发生效期短的JWT配合cookie的设置逻辑做双保险。前后端分离架构下这个组合是目前最省事的认证方案。4. 常见问题与排障实录4.1 Django开发期的高频坑开发过程中最大的一个坑是跨域。前端跑在5173端口Django跑在8000端口浏览器默认会拦截跨域请求。解决方式用django-cors-headers配置里把前端地址加进白名单INSTALLED_APPS [corsheaders] MIDDLEWARE [corsheaders.middleware.CorsMiddleware] CORS_ALLOWED_ORIGINS [http://localhost:5173]第二个高频坑是CSRF校验。前后端分离的项目如果用session认证Django默认的CSRF中间件会拦住所有POST请求。我的处理方式是统一走JWT认证把SessionMiddleware和CsrfViewMiddleware对API路径放宽松不依赖CSRF token。如果项目必须保留session方案就要在前端请求里带上CSRF cookie里的token并在视图上加csrf_exempt。第三个坑是时区。Django项目创建的时候USE_TZ默认是True数据库存的是UTC时间前端直接展示会差8个小时。我统一在序列化器输出时转成本地时区不把时区转换的压力丢给前端。第四个坑是数据库迁移。很多新手创建完模型忘记跑makemigrations结果数据库里没表一查询就报错。我的流程习惯是创建模型后立即执行python manage.py makemigrations python manage.py migrate4.2 前端与后端联动问题前后端联调时Vite代理配错是最常见的。前端请求API必须走代理不然每个接口都要写全地址。vite.config.ts里这样配export default defineConfig({ server: { proxy: { /api: { target: http://127.0.0.1:8000, changeOrigin: true }, /ws: { target: ws://127.0.0.1:8000, ws: true } } } })WebSocket连不上的问题排查了好几轮。最后发现是路径没对应上前端连的是/ws/scan/1/Django routing里注册的却是ws/scan/int:scan_id/少了一层路径。所以联调第一件事就是对路径两边用一个常量字符串最稳妥。图表不刷新的问题通常出在响应式上。如果收到WebSocket消息后直接给数组pushVue3的深层响应式能检测到但如果你是给对象重新赋值必须用ref或reactive包装。我自己踩过一次把ECharts的数据源定义成普通变量socket消息到了页面数字变了图表不动改成ref之后秒好。4.3 部署与性能优化实践开发环境用runserver没问题线上部署要区分HTTP和WebSocket。我的方案是Gunicorn跑Django应用Daphne单独监听WebSocket端口Nginx做统一入口和反向代理。Nginx配置里必须加Upgrade头不然WebSocket握手过不去location /ws/ { proxy_pass http://127.0.0.1:8001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; }性能优化方面我做了三件最重要的事。第一是日志表加索引按source_ip和time建联合索引聚合查询从全表扫描变成索引扫描同一个查询快了十几倍。第二是规则匹配全部预编译加缓存检测接口的吞吐量翻了两倍不止。第三是扫描任务加了并发信号量同时跑的扫描任务不超过3个避免多任务并发把目标站点和本机资源都拖垮。最后聊聊我做这个项目的真实体会规则库是安全工具的魂框架只是载体。我一开始在Springboot和Django两个原型之间摇摆了将近一周最后选了Django核心原因不是谁语言更高级而是安全检测这个场景下Python的表达效率确实高一个量级正则、文本解析、网络请求、数据处理每一环都是Python的主场。真正开始写了才发现最花时间的不是搭建框架而是维护那几百条检测规则和一路过来的误报样本。建议后来者先把规则模型想透再动手写界面不然返工是必然的。后续我想把Nuclei的规则格式导入这个规则库再把扫描引擎拆成独立Agent一台管理端挂多台扫描节点并行扫多个目标这个方向走下去就更接近商业化产品了。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

IO-Link本质解析:不是通信协议,而是设备数字化的底层使能技术 2026/10/1 14:08:35

IO-Link本质解析:不是通信协议,而是设备数字化的底层使能技术

1. 从产线上的一个“黑盒子”开始:为什么IO-Link不是又一个通信协议?去年在苏州一家汽车零部件厂做设备联调,第一次见到IO-Link主站模块时,我下意识把它当成了普通IO扩展模块——插上电源、接好总线、配好地址,结果PLC…

阅读更多 →
Agent开发从Demo到生产:编排、RAG、工具调用、状态管理与安全兜底五大核心实践 2026/10/1 14:08:35

Agent开发从Demo到生产:编排、RAG、工具调用、状态管理与安全兜底五大核心实践

1. 从“会调API”到“能交付系统”:Agent开发真正的分水岭 做了近两年的Agent开发,我越来越觉得,这个领域表面上热闹得不行——新框架、新概念、新论文几乎每周都在刷屏,但真正落到工程里,能决定一个Agent项目成败的东…

阅读更多 →
Agent 时代的基础设施:数据、智能与进化层的工程实践 2026/10/1 14:08:35

Agent 时代的基础设施:数据、智能与进化层的工程实践

1. Agent 时代的基础设施到底在变什么 1.1 从“模型为中心”到“数据与执行环境为中心”的转向 过去两年,绝大多数团队做 AI 应用的路径都差不多:选一个能力最强的模型,把提示词打磨到极致,然后接一个向量库做检索,就…

阅读更多 →
Linux救援模式实战:从原理到修复fstab、GRUB与密码丢失 2026/10/1 14:08:35

Linux救援模式实战:从原理到修复fstab、GRUB与密码丢失

直接说结论:Linux救援模式是系统坏了以后,你还能进得去的那个最小可用环境。不管你是因为fstab写错、GRUB损坏、root密码丢失还是内核panic,只要手里有这份知识,大多数场景都能在不重装系统的前提下把机器救回来。这篇文章会从原理…

阅读更多 →
UG894中英对照版:Vivado Tcl脚本自动化流程实战指南 2026/10/1 14:08:35

UG894中英对照版:Vivado Tcl脚本自动化流程实战指南

简介:UG894中英文对照版是一份基于Vivado 2025.1的官方用户指南PDF,面向FPGA工程师,系统讲解Tcl脚本在Vivado中的自动化设计应用,覆盖综合、实现、报告生成等重复性任务。资源由1个PDF文件组成,压缩包大小12.5MB&#…

阅读更多 →
2024年TensorFlow学习指南:从安装到部署的实战经验与避坑手册 2026/10/1 14:08:28

2024年TensorFlow学习指南:从安装到部署的实战经验与避坑手册

看到“tensorflow”这个标题,我第一反应是:这又是一个谈了几年的老话题,但老话题每年都有新讲法。作为一个从TensorFlow 1.x就开始踩坑、经历了2.0大改版、又被同事拉去PyTorch阵营又遛回来的老用户,我想跟你说点实在的&#xff1…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉