anasahhm/Specter
GitHub: anasahhm/Specter
基于异步架构的 AI URL 威胁情报分析平台,融合技术信号提取与行为模式识别输出确定性风险评分。
Stars: 0 | Forks: 0
# SPECTER:基于 Wire API 的 AI 威胁情报平台
实时 URL 威胁分析。Wire API 提取技术信号,Google Generative AI 识别行为模式,确定性评分输出风险 (0-100)。异步架构可处理 120秒的 Wire API 和 45秒的 AI 调用,而不会造成阻塞。
[实时演示](https://specter-weld.vercel.app)
## 为什么开发这个项目
静态 URL 威胁检测存在缺陷:
- 基于黑名单的工具会漏掉 60% 以上的新钓鱼活动
- SaaS 解决方案每月花费 500 美元,且有 5 分钟的延迟
- 开源工具仅使用 regex 模式(误报率太高)
我需要混合智能:原始技术信号(域名年龄、SSL 有效性、重定向链)+ AI 模式识别(行为聚类、社会工程学向量)。而且它必须快速。
## 架构问题
**问题:** Wire API 耗时 120秒,Google Generative AI 耗时 45秒。如果我阻塞请求线程等待两者完成,用户将盯着加载动画长达 175 秒。
**解决方案:** 异步 worker 架构。
```
POST /api/investigations/start → returns investigation ID immediately (300ms)
Background: Wire API (120s) → AI Analysis (45s) → Threat Scoring (10s)
Frontend polls GET /api/investigations/:id every 2s with 3-min graceful timeout
Status persisted: processing → completed
User gets results without waiting (8-15s typical, 180s max)
```
这种模式具有可扩展性。调查 50 个 URL,稍后再回来查看。没有轮询地狱,也没有 WebSocket 的复杂性。
## 技术栈
**前端:** React 18 + Vite(比 Webpack 快 3-4 倍)+ Tailwind + Framer Motion
**后端:** Node.js/Express + MongoDB + Mongoose + Helmet.js + express-rate-limit
**智能分析:** Wire API(技术元数据)+ Google Generative AI(模式分析)
**认证:** JWT(30天过期)+ bcryptjs(salt: 10)+ 输入验证
**部署:** Vercel(前端)+ Render(后端)+ MongoDB Atlas(数据库)
## 安装与设置
### 前置条件
```
Node.js v18+, npm/yarn, MongoDB (Atlas free tier works)
```
### 克隆与安装
```
git clone https://github.com/anasahhm/specter.git
cd specter
# Backend
cd backend
npm install
cp .env.example .env # Add your API keys
# Frontend
cd frontend
npm install
cp .env.example .env
```
### 环境变量
**后端 (.env):**
```
NODE_ENV=development
PORT=5000
MONGODB_URI=mongodb+srv://user:password@cluster.mongodb.net/specter
JWT_SECRET=your-super-secret-key-minimum-32-characters
WIRE_API_KEY=your-wire-api-key-here
GOOGLE_GENERATIVE_AI_KEY=your-key-here
FRONTEND_URL=http://localhost:5173
```
**前端 (.env):**
```
VITE_API_URL=http://localhost:5000
VITE_APP_NAME=SPECTER
```
### 本地运行
**终端 1 (后端):**
```
cd backend && npm run dev
# 应输出:
# ╔══════════════════════════════════════════╗
# ║ SPECTER - SERVER STARTED ║
# ║ Port: 5000 | Database: Connected ║
# ║ Wire API: ✓ | Google AI: ✓ ║
# ╚══════════════════════════════════════════╝
```
**终端 2 (前端):**
```
cd frontend && npm run dev
# http://localhost:5173
```
**终端 3 (测试 API):**
```
curl http://localhost:5000/api/health
# {"status":"operational","timestamp":"2024-05-31T12:00:00.000Z"}
```
## 工作原理
### 3 阶段 Pipeline
**步骤 1:Wire API(120秒超时)**
- 域名元数据、SSL 证书、年龄、MX 记录
- 重定向链、技术栈检测
- 嵌入的链接、表单、脚本
- 输出:原始技术信号
**步骤 2:AI 分析(45秒超时)**
- Google Generative AI 模式识别
- 针对已知威胁的行为聚类
- 钓鱼向量识别
- 置信度评分和摘要生成
- 后备方案:AI 不可用时使用基于规则的分析
**步骤 3:威胁评分(10秒超时)**
- 风险评分 (0-100)
- 威胁分类(严重/高/中/低/安全)
- 诈骗概率、毒性评级、置信度
- 输出:最终判定
### 数据流
```
1. User submits URL
2. POST /api/investigations/start
3. Backend returns investigationId (status: processing)
4. Frontend polls GET /api/investigations/:id every 2s
5. Background: Step 1 → Step 2 → Step 3
6. Status changes to completed
7. Frontend renders results
```
## 我解决的棘手问题
### 1. **慢速外部 API 导致的阻塞**
- **问题:** Wire API + AI = 165秒。阻塞请求线程会严重影响用户体验 (UX)。
- **解决方案:** 异步 worker + 轮询。POST 请求会立即返回 ID,前端每 2秒轮询一次。
- **经验教训:** 对于耗时超过 10秒的外部 API,请务必使用异步 + 轮询或 WebSocket。
### 2. **速率限制滥用**
- **问题:** 用户频繁请求 API。机器人恶意抓取 URL 威胁情报。
- **解决方案:** 双重速率限制:
- 全局:100 次请求/15分钟(捕获分布式攻击)
- 单用户:5 次调查/分钟(防止单个用户滥用)
- 滑动窗口(非固定桶)
- **经验教训:** 单一速率限制是不够的。来自单个用户的攻击看起来与僵尸网络流量是不同的。
### 3. **外部 API 弹性**
- **问题:** 如果 Wire API 宕机了怎么办?如果 Google AI 返回错误怎么办?
- **解决方案:** 优雅降级:
- Wire API 失败 → 使用缓存的域名信誉数据
- Google AI 超时 → 回退到基于规则的威胁评分
- 两者均失败 → 返回带有明确警告的部分结果
- **经验教训:** 单点故障会引发连锁反应。必须在每一层构建后备方案。
### 4. **JWT Token 过期处理**
- **问题:** 用户调查需要数小时,但 token 在 30 天后就过期了。
- **解决方案:** Token 刷新模式:
- 30天 access token + refresh token
- 前端 axios 拦截器自动刷新
- 错误消息中不包含敏感数据
- **经验教训:** 切勿在错误响应中泄露 token 详情。
### 5. **重度依赖 JavaScript 的网站**
- **问题:** Wire API 只能看到静态 HTML。动态表单、混淆链接、JS 渲染的内容是不可见的。
- **解决方案:** 混合方法:
- Wire API 用于结构/技术分析
- Google AI 用于行为/模式分析
- 三角测量捕获各自遗漏的内容
- **经验教训:** 没有任何单一工具是完美的。需结合各自优势。
### 6. **MongoDB 连接池**
- **问题:** Mongoose 默认连接池大小 (5) 在并发负载下太小。
- **解决方案:** 在连接 URI 中调整连接池设置,并添加连接监控。
- **经验教训:** 数据库瓶颈会在负载下暴露,而不是在开发环境中。
## API 参考
### 认证
```
POST /api/auth/register
{ email, password, displayName? }
POST /api/auth/login
{ email, password }
GET /api/auth/profile
Headers: Authorization: Bearer {token}
```
### 调查
```
POST /api/investigations/start
{ targetType: "url", targetValue: "https://..." }
Returns: { investigationId, status: "processing" }
GET /api/investigations/:investigationId
Returns: Complete threat analysis
GET /api/investigations?page=1&limit=10
Returns: User's investigation history
PUT /api/investigations/:investigationId/bookmark
{ isBookmarked: boolean }
```
### 报告与分析
```
GET /api/reports/:investigationId
GET /api/reports/:investigationId/export?format=pdf|json
GET /api/analytics/user-stats
GET /api/analytics/threat-distribution
```
## 威胁指标
| 指标 | 范围 | 含义 |
|--------|-------|---------|
| **风险评分** | 0-100 | 整体威胁严重程度 |
| **威胁等级** | 严重/高/中/低/安全 | 分类 |
| **检测到钓鱼** | 是/否 | 已知的钓鱼模式 |
| **诈骗概率** | 0-100% | 欺诈意图的可能性 |
| **毒性评分** | 0-100 | 内容毒性 |
| **置信度得分** | 0-100% | 分析的确定性 |
## 性能
| 指标 | 目标 | 实际 |
|--------|--------|--------|
| 页面加载 | <2s | 1.2s |
| 调查启动 (API) | <500ms | 300ms |
| 结果可用 | <30s | 8-15s |
| API 响应时间 | <1s | 200-400ms |
| 数据库查询 | <100ms | 50-80ms |
## 安全性
**JWT 认证** - 30天 token 过期 + 刷新轮换
**密码哈希** - bcryptjs (salt rounds: 10)
**速率限制** - 100 次请求/15分钟 (全局) + 5 次/分钟 (单用户)
**Helmet.js** - CSP, X-Frame-Options, HSTS 等
**CORS** - 仅允许前端域名白名单
**输入验证** - 邮箱格式、密码熵、URL 结构
**错误处理** - 无敏感数据泄露
**环境隔离** - 密钥存放在 .env 中,绝不写入代码
## 部署
**前端 (Vercel):**
1. 推送至 GitHub
2. vercel.com/new → 导入仓库
3. 设置 `VITE_API_URL` 环境变量
4. 部署
**后端 (Render):**
1. render.com → 创建 Web Service
2. 关联 GitHub 仓库
3. 设置所有环境变量(MONGODB_URI、WIRE_API_KEY 等)
4. 部署
**数据库 (MongoDB Atlas):**
1. cloud.mongodb.com → 创建集群(免费套餐)
2. 获取连接字符串
3. 将你的 IP 加入白名单
4. 将其设置为 MONGODB_URI
## 项目结构
```
specter/
├── frontend/
│ ├── src/
│ │ ├── pages/ # Route components
│ │ ├── components/ # Reusable UI components
│ │ ├── hooks/ # Custom React hooks
│ │ ├── api/ # API client + interceptors
│ │ ├── context/ # Auth context
│ │ ├── utils/ # Helpers
│ │ └── styles/ # Global CSS
│ ├── vite.config.js
│ ├── tailwind.config.js
│ └── package.json
│
├── backend/
│ ├── src/
│ │ ├── routes/ # Express route handlers
│ │ ├── services/ # Business logic (Wire, AI, Scoring)
│ │ ├── models/ # Mongoose schemas
│ │ ├── config/ # Validation, constants
│ │ ├── scripts/ # Database seeders
│ │ ├── server.js # Express app setup
│ │ └── index.js # Entry point
│ └── package.json
│
└── docs/
├── ARCHITECTURE.md # System design
├── API.md # Endpoint reference
└── DEPLOYMENT.md # Production setup
```
## 测试
### 手动 API 测试
```
# 注册
curl -X POST http://localhost:5000/api/auth/register \
-H "Content-Type: application/json" \
-d '{"email":"test@example.com","password":"Test123!"}'
# 登录
curl -X POST http://localhost:5000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"test@example.com","password":"Test123!"}'
# 开始调查
curl -X POST http://localhost:5000/api/investigations/start \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"targetType":"url","targetValue":"https://example.com"}'
# 获取结果
curl http://localhost:5000/api/investigations/INVESTIGATION_ID \
-H "Authorization: Bearer YOUR_TOKEN"
```
### 浏览器测试
1. 注册账户
2. 测试 URL:`example.com`(安全)、`malicious-url.com`(可疑)
3. 验证威胁评分、钓鱼检测、报告生成
4. 检查调查历史记录和书签
## 故障排除
### 前端无法连接到后端
```
# 检查 Backend 是否正在运行
curl http://localhost:5000/api/health
# 检查 frontend/.env 中的 VITE_API_URL 是否与 Backend 匹配
# 检查 backend/.env 中的 FRONTEND_URL 是否与 frontend origin (http://localhost:5173) 匹配
# 检查浏览器控制台是否有 CORS 错误
```
### MongoDB 连接失败
```
# 验证 connection string
MONGODB_URI=mongodb+srv://user:password@cluster.mongodb.net/specter
# 检查 MongoDB Atlas 中的 IP 白名单(在开发环境中添加 0.0.0.0/0)
# 验证数据库用户是否具有正确的凭据
```
### Wire API 错误
- 检查 API key 是否有效且配额未超限
- 查看 Wire API 文档了解速率限制
- 启用调试日志:`DEBUG=* npm run dev`
### 调查超时 (>180s)
- 默认超时时间为 180 秒
- 检查后端日志以查找特定步骤的错误
- 先使用简单的 URL(例如 example.com)进行测试
## 统计数据
- **48 小时构建**(黑客松冲刺)
- **2100+ 行代码** (1200 行前端,900 行后端)
- **12 个 API endpoint**(认证、调查、报告、分析)
- **3 阶段 pipeline**(Wire API → AI → 评分)
- **典型延迟 8-15秒**(含超时最长为 8-180秒)
- **4 个数据库集合**(用户、调查、报告、分析)
- **18 个 React 组件**(模块化、可复用)
- **3 个后端服务**(Wire client、AI 分析器、威胁评分器)
## 学到了什么
1. **异步胜过阻塞。** 外部 API 超过 10秒?不要等待。异步 + 轮询的可扩展性更好。
2. **优雅降级拯救系统。** 当 Wire API 失败时,使用缓存数据。当 AI 超时时,使用规则。
3. **速率限制是多维度的。** 全局限制捕获僵尸网络。单用户限制捕获个人滥用。
4. **混合智能有效。** 单一数据源存在盲区。Wire API + AI 可以捕获各自遗漏的内容。
5. **安全就是分层。** JWT + bcryptjs + Helmet + CORS + 输入验证 = 纵深防御。
## 许可证
MIT — 查看 [LICENSE](./LICENSE)
## 由 Anas Ahmed 制作
有问题?提交一个 [GitHub issue](https://github.com/anasahhm/specter/issues)
**在线访问:** https://specter-weld.vercel.app
标签:AI应用, MITM代理, URL分析, 威胁情报, 开发者工具, 异步架构, 搜索语句(dork), 自定义脚本