PraveenChigurla/Phishing_Website_Detector
GitHub: PraveenChigurla/Phishing_Website_Detector
一个结合自定义启发式引擎与多家外部威胁情报API的全栈钓鱼URL检测系统,提供Web界面、Chrome扩展和CLI扫描器以实时识别并拦截钓鱼网站。
Stars: 0 | Forks: 0
# 🛡️ 钓鱼网站检测器
一个基于 **Django**、**Next.js (TSX)** 和 **PostgreSQL** 构建的现代全栈钓鱼 URL 检测系统。它将加权启发式评分引擎与来自四家安全供应商 API 的实时威胁情报相结合,能准确地将 URL 分类为 **安全 (SAFE)**、**可疑 (SUSPICIOUS)** 或 **钓鱼 (PHISHING)** —— 同时将误报率降至最低。
## ✨ 核心功能
- **多层检测** — 15+ 种启发式信号(词法、WHOIS、SSL、JavaScript、HTML 内容分析)与外部供应商共识相结合。
- **供应商共识优先** — 外部 API 判定可覆盖嘈杂的启发式信号。像 `checkphish.bolster.ai` 这样的 URL 不会仅仅因为包含“phish”一词就被标记。
- **4 个外部安全 API** — Google Safe Browsing、VirusTotal、IPQualityScore 和 URLScan.io。
- **白名单 / 黑名单策略** — 由管理员管理的域名覆盖,用于即时判定。
- **扫描历史记录** — 每次扫描都会保存完整的证据,以供审计和审查。
- **Chrome 扩展程序** — 在风险网站加载前,通过警告页面实时拦截钓鱼网站。
- **CLI 扫描器** — 通过 `node index.js` 进行快速的基于终端的 URL 扫描。
- **玻璃拟态 UI** — 简洁现代的 Next.js 前端,具备实时评分、投票明细和微动画效果。
## 🛠️ 技术栈
| 层级 | 技术 | 详情 |
|---|---|---|
| **后端** | Django 6.0 + Django REST Framework | REST API、评分引擎、数据库模型 |
| **前端** | Next.js 14 (App Router, TypeScript/TSX) | 结合 TailwindCSS 的玻璃拟态 UI |
| **数据库** | PostgreSQL (主要) / SQLite (备选) | 如果未安装 `psycopg2` 则自动回退 |
| **CLI** | Node.js (ES Modules) | 交互式终端扫描器 |
| **扩展程序** | Chrome 扩展程序 (Manifest V3) | 后台 service worker + 警告页面 |
## 📦 项目结构
```
Phishing_Website_Detector/
│
├── backend/ # Django backend
│ ├── phishing_backend/ # Django project settings
│ │ ├── settings.py # DB config, CORS, installed apps
│ │ ├── urls.py # Root URL routing → /api/
│ │ └── wsgi.py # WSGI entry point
│ ├── analyzer/ # Core analysis app
│ │ ├── models.py # ScanHistory, DomainPolicy models
│ │ ├── views.py # API views (AnalyzeURL, History, Policy)
│ │ ├── services.py # Heuristic engine + vendor integrations
│ │ ├── serializers.py # DRF serializers
│ │ └── urls.py # /api/analyze, /api/history, /api/policy
│ ├── run.py # Django management script (renamed from manage.py)
│ └── .env # ⚠️ Environment variables (NOT committed)
│
├── frontend/ # Next.js frontend
│ ├── src/
│ │ ├── app/ # App Router
│ │ │ ├── layout.tsx # Root layout
│ │ │ ├── page.tsx # Main scanner page
│ │ │ └── globals.css # Global styles
│ │ └── components/ # Reusable UI components
│ │ ├── ScannerInput.tsx # URL input form
│ │ ├── VerdictCard.tsx # Score + verdict display
│ │ ├── HeuristicsTab.tsx # Detailed heuristic breakdown
│ │ ├── ApiFeedsTab.tsx # External API results tab
│ │ ├── PolicyManager.tsx # Whitelist/Blacklist manager
│ │ └── ScanHistoryLog.tsx # Scan history viewer
│ ├── package.json
│ └── next.config.js
│
├── extension/ # Chrome Extension (Manifest V3)
│ ├── manifest.json # Extension config
│ ├── background.js # Service worker — intercepts navigation
│ ├── warning.html # Phishing warning interstitial page
│ └── icon.png # Extension icon
│
├── index.js # CLI scanner (Node.js)
├── package.json # Root package.json for CLI
├── .gitignore
└── README.md
```
## 🔑 必需的 API 密钥
本项目集成了 **4 个外部安全 API**。您需要从每个提供商获取免费的 API 密钥:
| # | 服务 | 用途 | 获取您的密钥 |
|---|---------|---------|--------------|
| 1 | **Google Safe Browsing** | 根据谷歌的威胁数据库检查 URL | [Google Cloud Console](https://console.cloud.google.com/apis/library/safebrowsing.googleapis.com) |
| 2 | **VirusTotal** | 汇总某个 URL 的 70+ 种防病毒引擎结果 | [VirusTotal API](https://www.virustotal.com/gui/join-us) |
| 3 | **IPQualityScore** | 返回风险评分、钓鱼/恶意软件/可疑标志 | [IPQS Dashboard](https://www.ipqualityscore.com/create-account) |
| 4 | **URLScan.io** | 提交 URL 以进行深度扫描和截图 | [URLScan API](https://urlscan.io/user/signup) |
## ⚙️ 环境变量
在 **`backend/.env`** 创建一个包含以下变量的文件:
```
# Django 配置
DEBUG=True
SECRET_KEY=your-secret-key-change-in-production
# Database 配置(将 DB_PASSWORD 留空以回退到 SQLite)
DB_NAME=phishing_db
DB_USER=postgres
DB_PASSWORD=
DB_HOST=127.0.0.1
DB_PORT=5432
# 外部 Service API 密钥(必需)
GOOGLE_SAFE_BROWSING_API_KEY=your_google_api_key_here
VIRUSTOTAL_API_KEY=your_virustotal_api_key_here
IPQUALITYSCORE_API_KEY=your_ipqs_api_key_here
URLSCAN_API_KEY=your_urlscan_api_key_here
```
## 🚀 快速开始
### 前置条件
- **Python 3.11+** (包含 `pip`)
- **Node.js 20+** (包含 `npm`)
- **PostgreSQL** (可选 — SQLite 开箱即用)
- **Git**
### 1. 克隆仓库
```
git clone https://github.com/PraveenChigurla/Phishing_Website_Detector.git
cd Phishing_Website_Detector
```
### 2. 后端设置
```
# 创建并激活虚拟环境
python -m venv venv
# Windows
.\venv\Scripts\Activate.ps1
# macOS/Linux
source venv/bin/activate
# 安装 Python 依赖
pip install -r backend/requirements.txt
# 创建环境文件
cp backend/.env.example backend/.env
# ✏️ 编辑 backend/.env 并添加你的 API 密钥
# 运行数据库 migrations
python backend/run.py migrate
# 启动 Django 开发服务器
python backend/run.py runserver 8000
```
API 现已在 **`http://127.0.0.1:8000/api/`** 上线运行
### 3. 前端设置
```
cd frontend
npm install
npm run dev
```
UI 现已在 **`http://localhost:3000`** 上线运行
### 4. CLI 扫描器 (可选)
```
# 从项目根目录
npm install
node index.js
```
### 5. Chrome 扩展程序 (可选)
1. 在 Chrome 中打开 `chrome://extensions/`。
2. 启用 **开发者模式** (右上角开关)。
3. 点击 **加载已解压的扩展程序** → 选择 `extension/` 文件夹。
4. 扩展程序图标将出现在您的工具栏中 — 它会自动扫描您访问的每一个 URL。
## 📡 API 端点
所有端点均带有 `/api/` 前缀。
| 方法 | 端点 | 描述 | 请求体 |
|--------|----------|-------------|------|
| `POST` | `/api/analyze` | 扫描 URL 并返回判定结果 | `{ "url": "https://example.com" }` |
| `GET` | `/api/history` | 列出所有历史扫描记录 (分页) | — |
| `GET` | `/api/policy` | 列出白名单/黑名单规则 | — |
| `POST` | `/api/policy` | 添加白名单/黑名单规则 | `{ "domain": "example.com", "policy": "whitelist", "reason": "..." }` |
| `POST` | `/api/urlscan` | 代理扫描至 URLScan.io | `{ "url": "https://example.com" }` |
| `GET` | `/api/ipquality?url=...` | 代理扫描至 IPQualityScore | 查询参数: `url` |
### 响应示例 (`POST /api/analyze`)
```
{
"Verdict": "SAFE",
"Final Score": 6.0,
"HeuristicReasons": [],
"Votes": {
"phishing": 0,
"suspicious": 0,
"legit": 4,
"uncertain": 0
},
"GoogleSafeBrowsing": { "status": "legit", "message": "No threats found." },
"VirusTotal": { "status": "legit", "message": "Only 0 malicious detections out of 93." },
"IPQualityScore": { "status": "legit", "message": "Risk score: 0" },
"Lexical": [ 3.0, { "url_length": 28, "has_ip": false, "..." : "..." } ],
"WHOIS": [ 1, { "domain_age_days": 3650, "whois_success": true } ],
"SSL": [ 1, { "ssl_status": "Valid" } ]
}
```
## 🧠 评分引擎工作原理
### 启发式信号 (15+ 种特征)
| 类别 | 检查的信号 |
|----------|-----------------|
| **词法** | URL 长度、URL 中的 IP 地址、`@` 符号、十六进制编码、非标准端口、子域名数量、URL 熵、路径深度 |
| **关键词** | URL 中与钓鱼相关的词汇 *(弱信号,仅扣 0.5 分)* |
| **WHOIS** | 域名年龄、注册商信息、RDAP 回退 |
| **SSL** | 证书有效性 (有效 / 无效 / 仅限 HTTP) |
| **JavaScript** | 可疑脚本 (键盘记录器、混淆的 eval、凭据外泄) |
| **HTML** | 带有外部表单操作的密码字段、隐藏的 iframe、外部 favicon |
| **免费托管** | 检测免费平台 (vercel.app, netlify.app, github.io 等) |
### 判定决策规则
```
Rule 1: If ALL external APIs say "legit" → SAFE (vendor consensus wins)
Rule 2: If 2+ APIs say "legit" & none say phishing → SAFE
Rule 3: If Google Safe Browsing flags phishing → PHISHING (authoritative)
Rule 4: If 2+ sources say phishing → PHISHING
Rule 5: If 1 phishing vote or 2+ suspicious → SUSPICIOUS
Rule 6: Heuristic suspicious + all APIs uncertain → SUSPICIOUS
Else: → SAFE
```
### 评分范围
| 分数 | 判定结果 |
|-------|---------|
| 0.0 – 3.5 | 🔴 **钓鱼 (PHISHING)** |
| 3.6 – 5.5 | 🟡 **可疑 (SUSPICIOUS)** |
| 5.6 – 10.0 | 🟢 **安全 (SAFE)** |
## 🧪 测试
### 测试 URL
| URL | 预期判定 | 原因 |
|-----|------------------|-----|
| `https://www.facebook.com` | ✅ 安全 (SAFE) | 知名域名,所有 API 均确认 |
| `https://checkphish.bolster.ai` | ✅ 安全 (SAFE) | 合法的安全公司,供应商共识覆盖了关键词判定 |
| `https://phishing-website-flax.vercel.app` | ⚠️ 可疑 (SUSPICIOUS) | 免费托管 + 可疑关键词 + IPQS 对其进行了标记 |
### 运行测试
```
python backend/run.py test
```
## 📄 许可证
MIT License — 可免费使用、修改和分发。
## 👤 作者
**Praveen Chigurla** — [GitHub](https://github.com/PraveenChigurla)
标签:Django, MITM代理, 后端开发, 威胁情报, 开发者工具, 测试用例, 逆向工具, 钓鱼检测