AlirezaAlavi7713/web-vulnerability-scanner
GitHub: AlirezaAlavi7713/web-vulnerability-scanner
面向教育场景的 Web 漏洞扫描器,分析公开网站的 HTTP 安全标头、信息泄露、HTTPS 配置等并给出安全评分。
Stars: 0 | Forks: 0
# Web 漏洞扫描器
一个用于分析公开网站 HTTP 安全配置的全栈教育工具。
## 技术栈
| 层级 | 技术 |
|-----------|-------------------------------------------|
| Frontend | React 19 + Vite 5 |
| Backend | Node.js + Express 4 |
| HTTP | Axios (Backend 端客户端) |
| 安全 | Helmet, express-rate-limit |
## 分析功能
### 1. 安全标头
| 标头 | 作用 | 分数 |
|---|---|---|
| `Strict-Transport-Security` | 强制使用 HTTPS,防范 MITM | 15 |
| `Content-Security-Policy` | 限制资源来源,阻断 XSS | 15 |
| `X-Frame-Options` | 阻止通过 iframe 进行的点击劫持 | 10 |
| `X-Content-Type-Options` | 阻止 MIME 嗅探 | 10 |
| `Referrer-Policy` | 控制 URL 泄露 | 5 |
| `Permissions-Policy` | 限制浏览器 API 的使用 | 5 |
### 2. 信息泄露
- `Server` 标头 — 暴露服务器端技术(例如:`Apache/2.4.41`)
- `X-Powered-By` 标头 — 暴露框架(例如:`Express`)
- 未设置 `HttpOnly` 标志的 Cookies — 可通过 JavaScript 访问(存在 XSS 盗取风险)
- 未设置 `Secure` 标志的 Cookies — 可能通过 HTTP 明文传输
### 3. HTTPS
- 使用 HTTPS 还是 HTTP
- 是否存在从 HTTP 到 HTTPS 的重定向
### 4. 安全评分 (0–100)
每个检查点都会被标记为 **OK** (绿色) / **警告** (橙色) / **危险** (红色)。
| 分数 | 评级 | 含义 |
|---|---|---|
| 80–100 | A | 优秀 |
| 60–79 | B | 良好 |
| 40–59 | C | 中等 |
| 0–39 | D | 不足 |
## SSRF 防护 (Server-Side Request Forgery)
后端会拒绝指向以下地址的 URL 请求:
- **私有 IP**:`10.x.x.x`, `172.16–31.x.x`, `192.168.x.x`
- **环回地址 (Loopback)**:`127.x.x.x`, `::1`, `0.x.x.x`
- **链路本地地址 (Link-local)**:`169.254.x.x`(包含 AWS/GCP 的 metadata `169.254.169.254`)
- **本地主机名**:`localhost`, `*.local`, `*.internal`, `*.localhost`
- **解析为私有 IP 的 DNS** — 防范 DNS 绕过攻击
## 安装与启动
### Backend
```
cd backend
npm install
cp .env.example .env
npm start # http://localhost:3001
```
服务器将在端口 **3001** 上启动(以避免与端口 3000 上的其他项目发生冲突)。
### Frontend
```
cd frontend
npm install
npm run dev # http://localhost:5173
```
## API
### `POST /api/scan`
**请求体:**
```
{ "url": "https://example.com" }
```
**响应:**
```
{
"url": "https://example.com",
"scannedAt": "2025-01-01T12:00:00.000Z",
"score": 72,
"statusCode": 200,
"https": {
"usesHttps": true,
"redirectsToHttps": false,
"status": "OK",
"description": "HTTPS actif. Cependant, aucune redirection HTTP → HTTPS détectée."
},
"headers": {
"strict-transport-security": {
"name": "Strict-Transport-Security (HSTS)",
"present": true,
"value": "max-age=31536000; includeSubDomains",
"status": "OK",
"description": "HSTS actif. Le navigateur est forcé à utiliser HTTPS.",
"score": 15
}
},
"leakage": {
"server": { "name": "Header Server", "exposed": false, "value": null, "status": "OK" },
"xPoweredBy": { "name": "Header X-Powered-By", "exposed": true, "value": "Express", "status": "WARNING" },
"cookies": [
{ "name": "session", "hasHttpOnly": true, "hasSecure": false, "status": "WARNING" }
]
}
}
```
**限制:**
- 每 15 分钟窗口期内限制 20 次请求 (rate limiting)
- 拒绝私有或本地 URL (SSRF 防护)
## 本项目涵盖的知识点
| 概念 | 说明 |
|---|---|
| **HTTP 安全标头** | 每个标头存在的目的及其防范的攻击类型 |
| **SSRF** | 服务器如何被利用来攻击其自身的内部网络 |
| **安全 Cookies** | `HttpOnly`、`Secure` 的区别及相关的安全风险 |
| **信息泄露** | 为何隐藏 `Server` 和 `X-Powered-By` 能减少攻击面 |
| **HTTPS 与 HTTP** | “拥有证书”与“强制使用 HTTPS”之间的区别 |
| **Rate limiting** | 保护公共 API 免遭滥用的基础防护措施 |
| **输入验证** | 为什么永远不要信任用户提供的 URL |
## 项目结构
```
web-vulnerability-scanner/
├── backend/
│ ├── index.js # Point d'entrée Express
│ ├── routes/
│ │ └── scan.js # POST /api/scan
│ ├── services/
│ │ └── scanner.js # Logique d'analyse HTTP
│ ├── utils/
│ │ └── urlValidator.js # Validation + protection SSRF
│ ├── .env.example
│ └── package.json
├── frontend/
│ ├── src/
│ │ ├── App.jsx # État global, orchestration
│ │ ├── App.css # Styles (dark theme)
│ │ ├── components/
│ │ │ ├── ScanForm.jsx # Formulaire URL
│ │ │ ├── Dashboard.jsx # Affichage résultats
│ │ │ ├── ScoreCircle.jsx # Score SVG animé
│ │ │ └── CheckItem.jsx # Ligne de vérification
│ │ └── services/
│ │ └── api.js # Client Axios
│ ├── index.html
│ └── package.json
└── README.md
```
标签:GNU通用公共许可证, HTTP安全审计, MITM代理, Node.js, React, Syscalls, Web漏洞扫描器, 安全合规检测, 自定义脚本