Barsa-rana982/AI-Based-Phishing-Detection-System
GitHub: Barsa-rana982/AI-Based-Phishing-Detection-System
结合静态规则、XGBoost和LLM三重检测的钓鱼URL与邮件分析系统,通过Streamlit应用提供可视化风险评估与可解释报告。
Stars: 0 | Forks: 0
# 钓鱼欺诈对抗
一个钓鱼 URL 分析器,将三种独立的检测方法——
静态规则分析、训练好的 XGBoost ML 模型以及 LLM 语义
推理——整合到一个 Streamlit Web 应用程序中。
## 功能
- **静态分析** — 17 种基于规则的信号(IP 主机、URL 缩短服务、
typosquatting、同形异义词欺骗、子域名中包含品牌名、可疑路径
关键词、高域名熵、punycode/IDN、可疑 TLD、过多的
子域名、长 URL、URL 中的 `@`、纯 HTTP、重定向参数、数字
域名、双重文件扩展名、非标准端口、十六进制编码的域名)
- **ML 模型** — 在 18 个 URL 衍生特征上训练的 XGBoost 分类器,具备 SHAP
可解释性
- **LLM 分析** — 使用 Ollama(本地/免费)或 OpenAI API 在
基于规则的信号之上进行语义推理
- **单 URL 拆解** — 评分、触发的信号、熵、最接近的安全域名、
Levenshtein 距离
- **风险仪表盘** — 可视化的 0–100 分数,带有颜色编码的区间
- **分析历史** — 每次扫描都会记录到 `history.csv`
- **可下载报告** — PDF(需要 fpdf2)或纯文本
## 项目结构
```
├── app.py # Streamlit web UI
├── url.py # URL extraction + static signal analysis
├── classify.py # ML model training (XGBoost, Random Forest, Logistic Regression)
├── llm_url.py # LLM backend (Ollama / OpenAI)
├── evaluate_cross_corpus.py # Leave-one-corpus-out validation
├── ablation_ml_contribution.py # Ablation: ML contribution vs rule score
├── requirements.txt # Python dependencies (pinned)
├── model.pkl # Trained XGBoost model (generated by classify.py)
├── LICENSE # MIT
└── README.md
```
## 数据集
本项目使用 Kaggle 上 Naser Abdullah Alam 发布的公开
**[Phishing Email Dataset](https://www.kaggle.com/datasets/naserabdullahalam/phishing-email-dataset)** —
这是一个众所周知的电子邮件语料库集合。原始的
CSV 文件**未提交到此存储库**(它们总计约 100 MB,最好
引用来源而不是重新托管);请在训练前从 Kaggle 下载它们。
本项目的 URL 分析管道使用四个带有 `urls` 列的语料库(每封邮件标记为
`1` = 钓鱼 / `0` = 合法):
| 文件 | 行数 | 钓鱼邮件 | 合法邮件 | 来源 |
|------|-----:|---------:|------:|--------|
| `CEAS_08.csv` | 39,154 | 21,842 | 17,312 | CEAS 2008 垃圾邮件检测挑战赛 |
| `SpamAssassin.csv` | 5,809 | 1,718 | 4,091 | SpamAssassin 公开语料库 |
| `Nigerian_Fraud.csv` | 3,332 | 3,332 | 0 | “尼日利亚” 419 欺诈信件 (1998–2007) |
| `Nazario.csv` | 1,565 | 1,565 | 0 | José Nazario 钓鱼邮件收集 |
每一行包含:`sender, receiver, date, subject, body, label, urls`。
### 如何获取数据
```
pip install kaggle
# 需要免费的 Kaggle 账户 + API token (kaggle.json)
kaggle datasets download -d naserabdullahalam/phishing-email-dataset \
-p "Phishing Email Dataset/" --unzip
```
`Phishing Email Dataset/` 文件夹已被 git 忽略,因此数据会保留在本地。
## 安装
```
pip install -r requirements.txt
```
对于本地 LLM 后端:
```
pip install ollama
ollama pull llama3.2
```
OpenAI 后端(`pip install openai`)可在任何地方运行——用户需要在
应用侧边栏中提供 API 密钥。
## 用法
**1. 从数据集中提取 URL 特征**
```
python url.py --input "Phishing Email Dataset" --output analysis.csv
```
**2. 训练 ML 模型**
```
python classify.py --analysis analysis.csv --dataset "Phishing Email Dataset"
```
这将打印出 Logistic Regression、Random Forest 和 XGBoost 的 5 折交叉验证结果
(precision、recall、F1、ROC-AUC),然后将训练好的模型保存到
`model.pkl`。
**3. 运行 Web 应用**
```
streamlit run app.py
```
打开 ,粘贴 URL 或电子邮件正文,然后点击 **Analyse**。
## 这三种评分的工作原理
| 方法 | 百分比含义 | 计算方式 |
|--------|------------------|--------------------|
| 静态分析 | 触发了多少风险规则,按严重程度加权 | 累加固定点数的启发式方法,上限为 100 |
| ML | 输入为钓鱼邮件的概率 | 基于 18 个汇总特征的 XGBoost `predict_proba` |
| LLM | LLM 自我报告对其自身判断的确信度 | LLM JSON 响应字段(未根据真实值进行校准) |
这三种方法是独立的,通常会得出不同的值——这是
预期之中的设计行为。
## 模型性能
基于合并数据集(`classify.py`)的 **5 折分层交叉验证** 结果。
运行训练步骤即可重现这些数据。
| 模型 | Precision | Recall | F1 | ROC-AUC |
|-------|----------:|-------:|---:|--------:|
| Logistic Regression | | | | |
| Random Forest | | | | |
| **XGBoost**(主要) | | | | |
XGBoost 是发布的模型;SHAP 特征重要性(在应用程序中显示并由
`classify.py` 打印)解释了哪些信号驱动了每次预测。
### 跨语料库验证(模型是否具有泛化能力?)
标准的 5 折 CV 会将所有语料库混合在一起——这是一个公平的同分布
评估,但它无法排除模型学到了电子邮件来自*哪个语料库*的情况。
`evaluate_cross_corpus.py` 使用 **留一语料库法 (leave-one-corpus-out)**
验证对此进行了测试:在除一个语料库之外的所有语料库上进行训练,在训练中从未见过的保留语料库上进行测试。
```
python evaluate_cross_corpus.py --analysis analysis.csv --dataset "Phishing Email Dataset"
```
| 保留语料库 | Precision | Recall | F1 | ROC-AUC |
|-----------------|----------:|-------:|---:|--------:|
| CEAS_08 | | | | |
| SpamAssassin | | | | |
| Nigerian_Fraud | | | | n/a |
| Nazario | | | | n/a |
### 消融实验:ML 增加了多少价值?
XGBoost 模型接收 `max_risk_score`(规则引擎的综合评分)作为
特征之一。`ablation_ml_contribution.py` 通过三种 5 折 CV 配置
检查 ML 是学习到了独立的信号还是仅仅在重复该评分。
```
python ablation_ml_contribution.py --analysis analysis.csv --dataset "Phishing Email Dataset"
```
| 配置 | F1 | ROC-AUC |
|--------|---:|--------:|
| A — 完整(18 个特征) | | |
| B — 减去规则评分 | | |
| C — 仅规则评分 | | |
*A − B* 较小 ⇒ ML 不依赖于规则评分(方法保持独立)。
*A − C* 为正 ⇒ ML 在规则引擎之上增加了价值。
## 数据考量与局限性
这四个语料库被合并为一个带标签的训练集。合并
保留了每封电子邮件的内容和标签,但有一些属性
会影响准确率的解读:
- **不同来源间的类别不平衡。** Nazario 和 Nigerian_Fraud 是
纯钓鱼邮件;SpamAssassin 大部分是合法的。合并成分差异如此之大的语料库
可能会诱使模型去学习邮件来自*哪个语料库*,
而不是去学习使其成为钓鱼邮件的特征。
- **为什么本项目相对稳健。** 训练使用的是 **URL 结构**特征
(typosquatting、熵、子域名中包含品牌名、可疑 TLD 等),而不是
原始电子邮件文本。URL 结构反映了攻击者的行为,其跨语料库的
泛化能力远好于文体特征。不平衡问题也得到了
明确的处理(LR/RF 使用 `class_weight="balanced"`,XGBoost 使用 `scale_pos_weight`)。
- **仅限静态分析。** 没有 DNS、WHOIS 或实时页面抓取——位于受感染的*合法*域名
(外观整洁的 URL)上的钓鱼页面不会被标记。
- **应如何解读结果。** CV 数据是公平的同分布评估;
对于较新的钓鱼工具包和未知域名,实际场景中的性能可能会
更低。该工具最好作为结合了三项独立检查的**决策支持信号**来使用,
而不是作为孤立的最终判断。
## LLM 配置
从应用程序的侧边栏中选择后端:
| 后端 | 设置 | 备注 |
|---------|---------|-------|
| Ollama(默认) | 模型名称(例如 `llama3.2`) | 免费,在本地运行 — 需要安装 Ollama |
| OpenAI API | API 密钥 + 模型(例如 `gpt-4o-mini`) | 需要 OpenAI 账户 |
## 风险评分指南
| 评分 | 判定 |
|-------|---------|
| 0 | 可能安全 |
| 1–20 | 低风险 |
| 21–50 | 中等风险 — 需谨慎对待 |
| 51–75 | 可能是钓鱼 |
| 76–100 | 几乎可以确定是钓鱼 |
## 部署
在 **[Streamlit Community Cloud](https://share.streamlit.io)** 上免费部署:
使用 GitHub 登录 → *New app* → 选择此存储库,主文件 `app.py` → Deploy。
免费层级提供 3 个应用,具有 1 GB 资源限制,并在推送时自动重新部署。
## 许可证
在 [MIT License](LICENSE) 下发布。
标签:AI风险缓解, Apex, DLL 劫持, Kubernetes, Petitpotam, Streamlit, XGBoost, 云计算, 大语言模型, 安全分析工具, 机器学习, 规则引擎, 访问控制, 逆向工具, 钓鱼检测