huziifa/phishing-url-classifier

GitHub: huziifa/phishing-url-classifier

基于梯度提升算法的机器学习钓鱼URL检测器,通过30项特征分析实现97.4%准确率的钓鱼网站识别。

Stars: 0 | Forks: 0


Stars Forks Issues Accuracy





## 📋 目录
点击展开 - [🧠 关于本项目](#-about-the-project) - [✨ 核心特性](#-key-features) - [⚙️ 工作原理](#️-how-it-works) - [🧮 30 项特征](#-the-30-features) - [📊 模型基准测试](#-model-benchmarks) - [🛠️ 技术栈](#️-tech-stack) - [📁 项目结构](#-project-structure) - [🚀 快速开始](#-getting-started) - [💻 用法](#-usage) - [📂 数据集](#-dataset) - [🏆 结果与分析](#-results-and-analysis) - [🛣️ 路线图](#️-roadmap) - [🤝 贡献](#-contributing) - [📄 许可证](#-license) - [👤 作者](#-author)
## 🧠 关于本项目 网络钓鱼攻击占全球**数据泄露的 90% 以上**。攻击者通过创建极具欺骗性的虚假网站来窃取凭证、财务详情和个人信息——而传统的基于规则的过滤器越来越难以应对。 本项目通过**机器学习**解决了这一问题。该模型不再依赖会过期的黑名单,而是学习让 URL 显得可疑的结构模式——域名年龄、重定向链、锚文本比率、HTTPS 使用情况以及其他 26 种信号——并能泛化到从未见过的 URL。 ### 为什么选择机器学习? | 方法 | 局限性 | |----------|-----------| | 黑名单过滤 | 只能捕获已知的钓鱼网站 | | 基于规则的启发式算法 | 脆弱且极易被绕过 | | ✅ 机器学习 | 学习模式,能泛化到新的威胁 | ### 本项目的亮点 - **30 个手工提取的特征**,涵盖 URL 结构、域名情报、HTML 内容和网络信誉 - **在同一数据集上对 10 个模型进行了正面对比测试** - **97.4% 的准确率**和 99.4% 的召回率——几乎可以捕获所有钓鱼 URL - **生产级 Flask 应用**——提供实时 Web 界面,支持 Heroku 部署 ## ✨ 核心特性 ``` 🔍 Real-time URL analysis — Results in seconds 🤖 Gradient Boosting Classifier — Best-in-class accuracy 📊 Probability score display — Not just yes/no, but a confidence % 🌐 30-feature extraction engine — Deep structural URL analysis 🛡️ 99.4% phishing recall — Misses almost nothing ⚡ Lightweight Flask app — Fast, clean, deployable anywhere 📓 Full EDA Jupyter Notebook — Transparent, reproducible research ``` ## ⚙️ 工作原理 ``` ┌─────────────────────────────────────────────────────────────┐ │ USER INPUT │ │ Paste any URL into the web form │ └──────────────────────────┬──────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ FEATURE EXTRACTION │ │ FeatureExtraction class analyses the URL across 4 layers │ │ │ │ ① URL Structure ② Domain Intelligence │ │ ③ HTML Content ④ Web Reputation │ │ │ │ Outputs: 30 numerical features │ └──────────────────────────┬──────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ GRADIENT BOOSTING CLASSIFIER │ │ Pre-trained on 11,055 labelled URLs │ │ Outputs: class prediction + probability score │ └──────────────────────────┬──────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ RESULT │ │ ✅ "85.3% safe to visit" │ │ ⚠️ "12.1% safe — likely phishing" │ └─────────────────────────────────────────────────────────────┘ ``` ## 🧮 30 项特征 特征引擎通过四个分析层级提取信号: ### 🔗 第一层 — URL 结构(7 项特征) | 序号 | 特征 | 信号 | |---|---------|--------| | 1 | URL 中包含 IP 地址 | 钓鱼者使用 IP 来绕过域名信誉检查 | | 2 | URL 长度 | 合法 URL 平均约 54 个字符;钓鱼 URL 通常更长 | | 3 | URL 缩短服务 | 使用 bit.ly 等服务来隐藏恶意目的地 | | 4 | `@` 符号 | 强制浏览器忽略 `@` 之前的所有内容 | | 5 | 重定向 `//` | 位置 7 之后的双斜杠表示重定向 | | 6 | 域名中的前缀/后缀 `-` | 带连字符的域名会模仿合法品牌(例如 `pay-pal.com`) | | 7 | 子域名数量 | 深度嵌套的子域名是常见的钓鱼模式 | ### 🌐 第二层 — 域名情报(5 项特征) | 序号 | 特征 | 信号 | |---|---------|--------| | 8 | HTTPS 协议 | 缺少 HTTPS 是一个危险信号 | | 9 | 域名注册时长 | 较短的注册时间表明是一次性域名 | | 10 | Favicon 来源 | 从外部域名加载的 Favicon 暴露了欺骗行为 | | 11 | 非标准端口 | 使用异常端口来绕过标准流量过滤器 | | 12 | 域名中的 HTTPS Token | 域名本身包含“https”是一种欺骗手段 | ### 🖥️ 第三层 — HTML 和 JavaScript(11 项特征) | 序号 | 特征 | 信号 | |---|---------|--------| | 13 | 请求 URL 比率 | 高比例的外部资源(图片、音频)表明是克隆网站 | | 14 | 锚点 URL 比率 | 指向与宿主不同域名的链接 | | 15 | Script/Link 标签比率 | 比例失调的外部脚本 | | 16 | 服务器表单处理程序 | 表单提交到 `about:blank` 或域外 | | 17 | 信息邮件 (`mailto:`) | 在表单中使用 `mailto:` 而不是服务器端处理程序 | | 18 | 异常 URL | 主机名与 WHOIS 注册数据不匹配 | | 19 | 网站转发 | 超过 2 次重定向属于可疑;4 次及以上属于高度可疑 | | 20 | 状态栏定制 | 使用 `onmouseover` 来伪装真实的链接目的地 | | 21 | 禁用右键 | 通过 JavaScript 阻止右键点击以防止检查 | | 22 | 弹出窗口 | 激进的 `alert()` 用法以窃取凭证 | | 23 | Iframe 重定向 | 加载恶意 payload 的隐藏 iframe | ### 📈 第四层 — 网络信誉(7 项特征) | 序号 | 特征 | 信号 | |---|---------|--------| | 24 | 域名年龄 | 钓鱼域名通常存在不到 6 个月 | | 25 | DNS 记录 | 没有 DNS 记录是虚假域名的强烈指标 | | 26 | 网站流量 | 较低的 Alexa 排名暗示这是一个不知名或新创建的网站 | | 27 | PageRank | 较低的 PageRank 与钓鱼相关 | | 28 | Google 索引 | 未被索引的页面通常是恶意的 | | 29 | 指向页面的链接 | 极少的外部链接表明这是一个全新的虚假网站 | | 30 | 统计报告 | 匹配已知钓鱼黑名单的 URL/IP | ## 📊 模型基准测试 十个分类器在相同的训练/测试集划分下进行了训练和评估: | 排名 | 模型 | 准确率 | F1 分数 | 召回率 | 精确率 | |:----:|-------|:--------:|:--------:|:------:|:---------:| | 🥇 | **Gradient Boosting Classifier** | **0.974** | **0.977** | **0.994** | **0.986** | | 🥈 | CatBoost Classifier | 0.972 | 0.975 | 0.994 | 0.989 | | 🥉 | XGBoost Classifier | 0.969 | 0.973 | 0.993 | 0.984 | | 4 | Multi-layer Perceptron | 0.969 | 0.973 | 0.995 | 0.981 | | 5 | Random Forest | 0.967 | 0.971 | 0.993 | 0.990 | | 6 | Support Vector Machine | 0.964 | 0.968 | 0.980 | 0.965 | | 7 | Decision Tree | 0.960 | 0.964 | 0.991 | 0.993 | | 8 | K-Nearest Neighbors | 0.956 | 0.961 | 0.991 | 0.989 | | 9 | Logistic Regression | 0.934 | 0.941 | 0.943 | 0.927 | | 10 | Naive Bayes Classifier | 0.605 | 0.454 | 0.292 | 0.997 | ### 特征重要性

**最重要的 3 个特征:** 1. 🔒 **HTTPS** — 是否存在有效的证书 2. ⚓ **AnchorURL** — 指向域外的链接比例 3. 📡 **WebsiteTraffic** — Alexa 流量排名 ## 🛠️ 技术栈
| 分类 | 技术 | 用途 | |----------|-----------|---------| | **语言** | Python 3.6+ | 核心开发 | | **Web 框架** | Flask 2.0.2 | Web 应用程序和 API | | **机器学习** | scikit-learn 1.0.1 | 模型训练和推理 | | **数据** | NumPy · Pandas | 数值处理 | | **抓取** | BeautifulSoup4 · Requests | HTML 特征提取 | | **域名情报** | python-whois · googlesearch | WHOIS 和搜索分析 | | **部署** | Gunicorn · Procfile | 生产服务器和 Heroku | | **Notebook** | Jupyter | EDA 和模型实验 |
## 📁 项目结构 ``` Huzaifa/ │ ├── 📂 pickle/ │ └── model.pkl # Trained GBC model (download separately) │ ├── 📂 static/ │ └── styles.css # Web app stylesheet │ ├── 📂 templates/ │ └── index.html # Main web interface │ ├── 📓 Phishing URL Detection.ipynb # EDA, training and evaluation notebook ├── 🐍 app.py # Flask entry point ├── 🔧 feature.py # 30-feature extraction engine ├── 📊 phishing.csv # Training dataset (11,055 URLs) ├── 🚀 Procfile # Heroku deployment config ├── 📋 requirements.txt # Python dependencies └── 📖 README.md ``` ## 🚀 快速开始 ### 前置要求 - Python **3.6+** - pip - Git ### 安装说明 **第 1 步 — 克隆代码库** ``` git clone https://github.com/huziifa/Huzaifa.git cd Huzaifa ``` **第 2 步 — 创建并激活虚拟环境** ``` # 创建 python -m venv venv # 在 Windows 上激活 venv\Scripts\activate # 在 Mac / Linux 上激活 source venv/bin/activate ``` **第 3 步 — 安装依赖** ``` pip install -r requirements.txt ``` **第 4 步 — 下载训练好的模型** 由于 GitHub 的文件大小限制,`model.pkl` 文件单独托管。 下载并将其放在 `pickle/` 文件夹中: ``` 📥 Download model.pkl — [Link Here] ``` 将文件放置于: ``` Huzaifa/pickle/model.pkl ``` **第 5 步 — 启动应用** ``` python app.py ``` **第 6 步 — 在浏览器中打开** ``` http://127.0.0.1:5000 ``` ## 💻 用法 1. 在浏览器中打开 Web 应用 2. 将任意 URL 粘贴到输入框中 3. 点击 **Check URL** 4. 接收即时结果: ``` ✅ https://github.com → 96.2% safe ✅ https://google.com → 94.8% safe ⚠️ http://paypa1-verify.tk → 3.1% safe ← phishing detected ⚠️ http://secure-login.free.fr → 7.4% safe ← phishing detected ``` ## 📂 数据集 | 属性 | 值 | |----------|-------| | **来源** | [UCI 机器学习仓库](https://archive.ics.uci.edu/ml/datasets/phishing+websites) | | **URL 总数** | 11,055 | | **特征数** | 30 | | **钓鱼网站** | 4,898 个样本 (-1) | | **可疑网站** | 702 个样本 (0) | | **合法网站** | 6,157 个样本 (1) | | **训练/测试集划分** | 80% / 20% | ## 🏆 结果与分析 ### 最终模型表现 ``` ┌─────────────────────────────────────────┐ │ Gradient Boosting Classifier │ │ │ │ Accuracy ████████████████░ 97.4% │ │ F1 Score ████████████████░ 97.7% │ │ Recall █████████████████ 99.4% │ │ Precision ████████████████░ 98.6% │ └─────────────────────────────────────────┘ ``` ### 主要结论 - **99.4% 召回率** — 模型几乎可以捕获所有钓鱼 URL。在安全领域,漏报一个钓鱼网站比误报危险得多,因此召回率是这里最关键的指标。 - **98.6% 精确率** — 只有极少数合法 URL 被错误标记,确保了可用、低阻力的体验。 - **关键信号** — HTTPS、AnchorURL 和 WebsiteTraffic 单独构成了大部分的预测能力,这证实了钓鱼者在这些维度上总是存在缺陷。 - **Naive Bayes 的失败** — 其 29.2% 的低召回率证明 URL 特征并不是条件独立的,这违背了 Naive Bayes 的核心假设。 ## 🛣️ 路线图 - [x] 特征提取引擎(30 项特征) - [x] 模型训练与基准测试(10 种算法) - [x] Flask Web 应用程序 - [x] Heroku 部署配置(Procfile) - [ ] REST API endpoint(`POST /api/check`) - [ ] 浏览器扩展集成 - [ ] 实时重新训练 pipeline - [ ] Docker 容器化 - [ ] 使用 GitHub Actions 实现 CI/CD ## 📄 许可证 基于 **MIT License** 分发。查看 [`LICENSE`](LICENSE) 了解完整条款。 ## 👤 作者
### Huzaifa *机器学习工程师与开发者* [![GitHub](https://img.shields.io/badge/GitHub-huziifa-181717?style=for-the-badge&logo=github)](https://github.com/huziifa) [![LinkedIn](https://img.shields.io/badge/LinkedIn-Connect-0A66C2?style=for-the-badge&logo=linkedin)](https://linkedin.com/in/huziifa)
**如果这个项目对你有帮助,请考虑给它点个 Star ⭐** *使用 Python、Flask 和 scikit-learn 构建*
[![Python](https://img.shields.io/badge/Python-3.6%2B-blue?style=for-the-badge&logo=python&logoColor=white)](https://www.python.org/) [![Flask](https://img.shields.io/badge/Flask-2.0.2-black?style=for-the-badge&logo=flask&logoColor=white)](https://flask.palletsprojects.com/) [![scikit-learn](https://img.shields.io/badge/scikit--learn-1.0.1-orange?style=for-the-badge&logo=scikitlearn&logoColor=white)](https://scikit-learn.org/) [![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](LICENSE)
![演示截图](https://raw.githubusercontent.com/huziifa/phishing-url-classifier/main/httpsuser-images.githubusercontent.com/79131292/144742825-23367f0f-9e67-4c99-ba1f-b86a187675c9.png)
## 📌 目录 - [概述](#-overview) - [工作原理](#-how-it-works) - [提取的特征](#-features-extracted) - [模型表现](#-model-performance) - [技术栈](#-tech-stack) - [项目结构](#-project-structure) - [快速开始](#-getting-started) - [用法](#-usage) - [数据集](#-dataset) - [结果](#-results) - [结论](#-conclusion) ## 🔍 概述 网络钓鱼是最普遍的网络犯罪形式之一,攻击者利用社会工程学或虚假网站欺骗受害者,窃取密码、用户名和财务凭证等敏感信息。 本项目利用**机器学习**,通过分析从 URL 中提取的 30 个手工特征来检测钓鱼 URL——包括域名结构、HTTPS 使用情况、网站流量等。在对 10 种不同的算法进行基准测试后,最终选择了 **Gradient Boosting Classifier** 作为最终模型,实现了 **97.4% 的准确率**。 该模型被部署为一个 **Flask Web 应用程序**,用户可以粘贴任何 URL 并立即获得安全预测结果。 ## ⚙️ 工作原理 ``` User submits URL │ ▼ Feature Extraction (30 features) │ ▼ Gradient Boosting Classifier │ ▼ Prediction: Safe / Phishing (with probability score) ``` 1. 用户在 Web 界面输入 URL。 2. `FeatureExtraction` 类分析 URL 并提取 30 个数值特征。 3. 训练好的 GBC 模型预测该 URL 是**安全**的还是**钓鱼**网站。 4. 返回概率得分并显示给用户。 ## 🧮 提取的特征 模型使用分为三类的 30 个特征: ### 基于 URL 的特征 | 序号 | 特征 | 描述 | |---|---------|-------------| | 1 | 使用 IP 地址 | 检查是否使用了 IP 地址而不是域名 | | 2 | URL 长度 | 标记异常长的 URL(>75 个字符) | | 3 | URL 缩短 | 检测已知的缩短服务,如 bit.ly、tinyurl | | 4 | `@` 符号 | 出现 `@` 会强制浏览器忽略前面的文本 | | 5 | 重定向 `//` | 位置 7 之后的双斜杠表示重定向 | | 6 | 前缀/后缀 `-` | 域名中的连字符是钓鱼网站的指示符 | | 7 | 子域名数量 | 多个子域名会增加钓鱼的可能性 | ### 基于域名的特征 | 序号 | 特征 | 描述 | |---|---------|-------------| | 8 | HTTPS | 检查是否使用了 HTTPS | | 9 | 域名注册时长 | 较短的注册期很可疑 | | 10 | Favicon | 从不同域名加载的 Favicon 暗示钓鱼 | | 11 | 非标准端口 | 使用异常端口 | | 12 | 域名 URL 中的 HTTPS | URL 的域名部分出现了“https” | ### HTML & JavaScript 特征 | 序号 | 特征 | 描述 | |---|---------|-------------| | 13 | 请求 URL | 加载的外部资源百分比 | | 14 | 锚点 URL | 指向外部的锚标签百分比 | | 15 | `