
简介面向网络安全与AI应用开发者这份资源提供一套基于深度学习的钓鱼页面检测系统前后端参考实现。项目按BackEnd_django_restful_api与FrontEnd_browser_plug_in划分后端基于Django RESTful接口与TensorFlow实现模型推理前端为Chrome浏览器插件可在每次打开页面时将URL发送至后台结合URL、页面特征外链比例、域名注册时间等完成拦截或放行。压缩包共187个文件、约42.55MB主要包含Python源码、模型权重data/model/checkpoint、浏览器插件JS/CSS、训练数据及HTML页面等目录清晰便于学习完整数据流。目前已有282人学习适合想掌握从特征提取到在线检测全链路实现或准备此类毕业设计/课设的读者参考。1. 项目背景与整体设计思路1.1 为什么选择深度学习方案做钓鱼页面检测先交代一下背景。这个项目最初源于一个很实际的痛点传统基于黑名单的钓鱼页面拦截方案在真实场景中的漏报率正在肉眼可见地升高。黑名单方案的逻辑很简单维护一个恶意URL库用户访问时做匹配。问题在于钓鱼页面的存活周期平均只有几十个小时等安全厂商发现、确认、下发名单攻击者早就换了一批域名和页面了。当年做这个项目的时候我列了一个对比表格把市面上几类主流方案的优劣势摆在一起。基于规则的检测方案依赖人工提取特征——比如URL中含不带连字符的IP地址、使用了非标准端口、域名注册时间不足90天等。这类方案对已知攻击模式有效但对变种和伪装效果不佳因为攻击者只要针对规则逐项规避就行。机器学习方案则能自动从数据中学习特征组合但对页面视觉结构的理解比较浅。最终我的结论是钓鱼页面从本质上说是一个视觉欺骗问题——攻击者伪造一个和真实登录页几乎一样的界面诱导用户输入账号密码。那么用深度学习模型直接去“看”页面的视觉呈现和DOM结构特征反而是最贴近问题本质的做法。这个项目定名为 webPish_detect核心定位是一个端到端的钓鱼页面检测系统用深度学习模型对网页进行智能识别同时配套完整的可视化运营平台让安全运营人员能快速判定、溯源和处置。整个系统采用了前后端分离架构模型服务作为独立中间层方便后续替换或升级算法模块。1.2 技术选型与架构分层在技术选型上我遵循三个原则一是模型推理性能要够快单次检测响应时间必须控制在秒级二是系统要易于部署维护模块间耦合度要低三是代码要可读、可扩展方便团队后续接手。整体架构分成四层。最底层是数据采集层负责从各类来源收集可疑URL和页面样本包括主动爬取、蜜罐捕获、威胁情报平台导入。往上是模型推理层用深度学习模型对页面进行分类打分输出是否为钓鱼页面的置信度。再往上是业务逻辑层负责样本管理、检测任务调度、结果审核、告警通知。最上层是展示层提供Web管理界面和API接口。前后端通信采用RESTful API设计检测请求通过异步任务队列提交避免高并发时阻塞模型服务。这里我特意没有直接用同步请求因为深度学习模型推理是CPU/GPU密集型操作如果前端同步等待接口响应时间会非常不稳定。提示架构设计中一个容易忽略的点是模型服务和无状态API服务的分离。模型推理服务最好单独部署这样模型升级时不需要重启业务服务只用切换流量即可。2. 深度学习模型构建核心细节2.1 模型输入的数据形态设计很多人一上来就想着直接丢HTML源码给模型训练这个思路有问题。HTML源码本质上是文本数据但钓鱼页面的核心欺骗性在于“看起来像”单纯从文本层面很难捕捉这种视觉相似性。我最终采用了双通道输入的思路。第一通道是页面的视觉表现也就是渲染后的截图。用Headless浏览器打开目标URL截取完整的页面长图然后缩放到统一尺寸比如224x224或299x299这是主流视觉模型的标准输入大小。第二通道是页面的关键文本特征包括URL的组成结构、页面标题、表单action地址、登录框周围的文本内容等这些经过token化后输入一个文本编码分支。实际操作中我踩过一个坑直接用Selenium或Playwright渲染页面时遇到那些需要JavaScript动态渲染的单页应用截图经常是空白或加载状态。后来把页面加载等待策略改成了“等待网络空闲”加上固定超时兜底截图的成功率从70%左右提高到了95%以上。2.2 模型结构与训练方案选型模型主体我选了ResNet50作为视觉特征提取的backbone主要原因是它在ImageNet上的预训练权重容易获取并且推理速度适中。如果你有更好的GPU资源可以换成EfficientNet或ConvNeXt精度会更高。文本分支用了一个轻量级的TextCNN虽然Transformer现在很火但这种长度不长、语义相对简单的文本场景TextCNN完全够用而且显存占用小。两个分支的输出特征拼接后经过两个全连接层最终输出一个二分类的概率值。整体训练框架用PyTorch配合torchvision自带的预训练模型。训练时冻结了ResNet50的前几层参数只微调后面的层这样小样本也能训得动不容易过拟合。训练数据的准备是个体力活。我从PhishTank、OpenPhish和自家蜜罐系统收集了约5万条恶意样本同时爬取了Alexa排名前10万的正常网站作为良性样本。正负样本比例控制在1:3左右保证模型见过足够多的正常页面降低误报率。# 模型定义的核心代码片段 import torch.nn as nn import torchvision.models as models class PhishDetectModel(nn.Module): def __init__(self, num_classes2): super().__init__() self.visual_branch models.resnet50(pretrainedTrue) self.visual_fc nn.Linear(1000, 256) self.text_branch TextCNN(embed_dim128, num_filters64) self.fusion nn.Sequential( nn.Linear(256 64, 128), nn.ReLU(), nn.Dropout(0.3), nn.Linear(128, num_classes) ) def forward(self, image, text): v_feat self.visual_branch(image) v_feat self.visual_fc(v_feat) t_feat self.text_branch(text) feat torch.cat([v_feat, t_feat], dim1) return self.fusion(feat)2.3 训练参数与环境配置心得训练环境我建议用Linux系统加NVIDIA显卡CUDA版本和PyTorch版本要对齐。具体来说PyTorch 2.x 搭配 CUDA 11.8 是比较稳妥的组合。安装时直接用官方源的命令安装不要自己手动去编译浪费时间还容易出问题。我在这块折腾过好几次教训比较深conda 环境里先装好 CUDA 工具包再装 PyTorch最后用torch.cuda.is_available()验证环境是否可用三步走最省心。训练超参数方面初始学习率设为 0.0001使用 AdamW 优化器batch size 设为 32训练 30 个 epoch。学习率采用余弦退火调度前 5 个 epoch 做 warmup。这里有个小技巧如果显存不够batch size 减半的同时学习率也要相应调低否则 loss 会震荡得很厉害。注意训练集和测试集一定要按域名维度去重划分不能按URL去重。否则同一个网站的多个页面会同时出现在训练集和测试集中模型会在“认网站”而不是“认钓鱼页面”评估指标会虚高上线后效果会大打折扣。3. 前后端架构与核心功能实现3.1 后端服务设计与接口规范后端我采用 FastAPI 框架实现选它的原因很简单原生支持异步、自动生成 OpenAPI 文档、性能在 Python 框架里排第一梯队。整个后端分为两个子服务一个是用于处理业务逻辑的 API 服务另一个是用于承载模型推理的独立服务。先说模型推理服务。它对外暴露两个接口一个是单条URL检测另一个是批量检测。单条检测的流程是接收URL参数调用浏览器渲染引擎截图同时提取文本特征分别做预处理后送入模型最后返回分类结果和置信度。批量检测则是走异步任务队列用 Celery 加 Redis 实现用户提交一批URL后立即获得任务ID前端通过轮询任务状态获取结果。API服务采用了DDD领域驱动设计的分层思想拆分为路由层、服务层、数据访问层。路由层只做参数校验和响应格式化业务逻辑全在服务层。这样做的直接好处是后来我们要增加一个“误报申诉”的功能完全不需要动模型服务只是加了两个数据表和一个接口的事情。# 模型推理服务的核心请求处理逻辑 app.post(/api/v1/detect) async def detect_url(request: DetectRequest): # 异步提交检测任务 task detect_task.delay(request.url, request.callback_url) return {task_id: task.id, status: pending} app.get(/api/v1/task/{task_id}) async def get_task_result(task_id: str): result redis_client.get(ftask:{task_id}) if result: return json.loads(result) return {status: processing}3.2 前端可视化平台设计前端我选了 Vue 3 加 Element Plus 组件库整个界面分四个核心功能区。第一个是检测面板支持单个URL输入和批量文件上传检测结果以卡片形式展示每条结果标注钓鱼置信度、关键证据截图和风险等级。第二个是样本管理列表所有历史检测记录都会留存支持按时间、域名、判定结果多维度筛选。第三个是审核工作台专门给安全运营人员使用可以人工复核模型判定结果纠正误报漏报审核结论会反馈到训练数据集。第四个是数据统计仪表盘展示今日检测量、钓鱼命中率、Top攻击域名等运营指标。前后端联调时有一个细节值得注意检测结果中需要展示页面截图作为证据但截图文件存在对象存储里前端拿到的是URL而不是二进制数据。接口设计上我把截图URL和检测结果一起返回前端用懒加载方式渲染缩略图点击大图预览。这样首次加载页面时不会因为大量图片导致接口响应缓慢。3.3 数据库设计与缓存策略数据库用的是 MySQL 8.0核心表有样本表、检测任务表、告警记录表和用户表。样本表是最大的表每天新增数十万条URL数据所以我按月份做了分区表查询时按时间条件自动路由到对应分区性能提升非常明显。Redis 缓存主要用在两个场景。第一个是对同域名的检测结果做短时缓存默认缓存10分钟避免攻击者轮换路径但同域名时产生重复检测请求。第二个是对模型推理结果做特征缓存同一页面的指纹特征如果已计算过且无变化直接从缓存返回判定结果大幅降低模型服务的压力。提示缓存设计时必须加上“页面变化感知”机制。我最初只是简单按URL做缓存结果有的站点主页挂了但子页面更新了缓存命中旧页面特征导致漏报。后来加入了页面内容哈希比对哈希变化则强制重新检测这个问题才彻底解决。4. 常见问题与实战排查记录4.1 模型训练与推理中的典型问题问题一训练时loss不下降。排查过程刚开始用双通道模型训练时loss 一直在 0.69 左右徘徊完全不收敛。这个值很典型因为在二分类中随机猜测的 loss 就是 ln2 ≈ 0.693。我逐项检查后发现问题出在文本分支的 Embedding 层没有加载预训练向量随机初始化导致梯度传播异常。换用训练好的 Word2Vec 向量后loss 正常下降。所以遇到 loss 不降先检查是不是某个分支的学习率设置不合理或参数没初始化好。**问题二推理速度太慢。正常单张图在 GPU 上推理只要几十毫秒但我在测试时发现接口耗时经常超过3秒。用cProfile分析后发现瓶颈根本不在模型推理而在页面渲染环节。Headless Chrome 启动实例耗时超过2秒而且每次请求都重新启动浏览器进程。后来改用常驻浏览器实例池方案启动时预热5个浏览器实例请求轮流复用渲染耗时降到了400毫秒左右。**问题三样本不平衡导致的误报。训练初期模型对正常页面的误报率在3%左右这在安全场景下是不可接受的。后来我在损失函数里给正样本加了权重简单说就是让模型判定为钓鱼页面时更加保守有效降低了误报。另外加入了Focal Loss做实验对比最终发现加权的 Focal Loss 对难样本的区分能力更好误报率降到了0.5%以下。4.2 前后端联调与部署阶段的坑前后端联调中最常见的跨域问题就不多说了直接上解决方案在 FastAPI 里加CORSMiddleware前端开发环境用 Vite 的 proxy 做代理转发生产环境用 Nginx 统一入口。这里要提醒一个细节Nginx 代理上传文件时client_max_body_size默认只有 1MB批量检测上传的URL文件稍微一大就被拦截。这个参数不显眼排查时容易忽略。部署阶段整个系统用 Docker Compose 编排共6个容器前端、后端API、模型服务、数据库、Redis、Celery Worker。GPU 容器是个容易踩坑的地方NVIDIA 的容器运行时必须提前装好否则 Docker 里识别不到显卡。我当时的解决方式是写了个启动前检查脚本自动检测 GPU 驱动是否可用避免服务起来了但模型全部跑 CPU慢到怀疑人生。4.3 运营效率提升的实战经验系统上线一段时间后我发现运营人员每天处理大量误报样本效率不高。后来在审核工作台增加了一个“相似样本聚合”的功能模型对每个页面生成128维的特征向量存入向量数据库审核时系统自动推荐与当前样本特征最接近的10个历史样本并标注历史审核结论。运营人员一看就知道这类页面之前是怎么判定的审核效率提升了3倍以上。另外一个实用技巧是对检测结果中的“高危行业”做定向监控。钓鱼攻击有明显的行业偏好银行、电商平台、邮箱服务是重灾区。我在告警配置里增加了行业标签规则命中这些行业的钓鱼页面会自动提高告警级别并通过企业微信机器人推送通知。这部分逻辑完全用规则引擎实现没有改动模型代码。4.4 系统后续迭代方向目前 webPish_detect 已经稳定运行了一段时间准确率、召回率和误报率三个关键指标都达到生产标准。不过我最近一直在思考几个可以优化的方向一是引入图神经网络对域名解析关系、页面跳转关系做图结构建模可能可以提前发现攻击团伙的基础设施二是加入主动学习机制让运营人员的每一次人工审核都成为模型迭代的训练数据实现模型的自进化三是优化检测链路从现在的“先访问页面再判断”演进为“通过静态特征预筛动态渲染复核”的两段式方案进一步降低检测延迟。我个人在实际操作中最大的体会是做安全检测类系统模型效果只是地基真正的护城河在工程架构的健壮性和运营闭环的完善度。模型漏报一条样本可以通过运营审核捞回来但系统架构不稳定导致检测服务挂掉那可是所有防护全部失效的局面。本文还有配套的精品资源点击获取