PhanDat1996/secure-web-guard
GitHub: PhanDat1996/secure-web-guard
一个生产级 Chrome/Edge 浏览器扩展,通过本地启发式风险评分引擎检测并拦截钓鱼和恶意网站。
Stars: 0 | Forks: 0
# Secure Web Guard v2
一个生产级的 Chrome/Edge Manifest V3 浏览器扩展,它使用基于置信度评分的风险引擎将每个访问的 URL 分类为三个安全等级。
## 安全分类模型
| 等级 | 分数范围 | 操作 |
|---|---|---|
| 🔴 **DANGER** | 80 – 100 | 阻止导航 → 重定向至拦截页面 |
| 🟡 **SUSPICIOUS** | 40 – 79 | 允许访问 + 浏览器通知 + 页面横幅 |
| 🟢 **CLEAN** | 0 – 39 | 静默允许访问 |
## 安装
1. 下载或克隆本仓库以获取 `secure-web-guard/` 文件夹。
2. 打开 **Chrome** 并访问 `chrome://extensions/`(或 `edge://extensions/`)。
3. 启用右上角的 **开发者模式** (Developer mode) 开关。
4. 点击 **加载已解压的扩展程序** (Load unpacked) 并选择 `secure-web-guard/` 文件夹。
5. 工具栏中会出现盾牌图标。您已处于保护之下。
## 测试
### 触发 DANGER 拦截 (score ≥ 80)
导航至以下任何列入黑名单的域名:
```
https://paypal-security-login.com
https://malware-download-center.com
https://secure-login-paypa1.com
https://cryptowallet-restore.io
https://microsoft-office365-login.com
```
您将被 **重定向至拦截页面**,其中包含完整的威胁详情、评分和指标。
### 触发 SUSPICIOUS 警告 (score 40–79)
这些启发式模式将被标记为 SUSPICIOUS,而无需被列入黑名单:
| URL 模式 | 原因 |
|---|---|
| `http://192.168.1.100/verify-account` | IP 主机名 (+25) + 关键词 (+10) = 35 → 可能跨越阈值 |
| `http://login-secure-update.xyz` | 高风险 TLD (+20) + 3 个关键词 (+30) = 50 → SUSPICIOUS |
| `http://a.b.c.d.e.example.com/login` | 过多层级的子域名 (+20) + 关键词 (+10) = 30+ |
| 任何长度大于 150 个字符且包含关键词的 URL | 长 URL (+15) + 关键词 = 可能判定为 SUSPICIOUS |
### 仅通过启发式规则触发 (通过积分达到 DANGER)
```
http://a.b.c.d.xn--pypal-4ve.com/login/verify/password/account
```
解析:Punycode (+30) + 过多层级的子域名 (+20) + 4 个关键词 (+30) + @ 符号 (+20) = 100 → DANGER
## 风险评分模型
每个访问的 URL 都会根据所有启发式规则进行评估,并将分数相加(上限为 100):
| 指标 | 分数 |
|---|---|
| 域名在钓鱼黑名单中 | +100 |
| 域名在恶意软件黑名单中 | +100 |
| 域名在自定义用户黑名单中 | +100 |
| 使用 IP 地址作为主机名 | +25 |
| Punycode / IDN 域名 (xn--) | +30 |
| 超过 4 层子域名 | +20 |
| URL 包含 '@' 符号 | +20 |
| URL 长度大于 150 个字符 | +15 |
| URL 中包含可疑关键词 (每个关键词加分,上限 30) | 每个 +10 |
| 高风险 TLD (.zip .top .xyz .click .country 等) | +20 |
| 可执行文件下载扩展名 (.exe .ps1 .bat 等) | +40 |
**检查的关键词:** login, verify, account, password, secure, bank, wallet, update, microsoft, office365, paypal, crypto
**高风险 TLD:** .zip, .top, .xyz, .click, .country, .loan, .gq, .ml, .cf, .tk
**可执行文件扩展名:** .exe, .scr, .vbs, .bat, .cmd, .ps1, .msi, .pif
## 项目结构
```
secure-web-guard/
├── manifest.json # MV3 manifest — permissions, service worker, CSP
├── background.js # Service worker: navigation interception + action dispatch
├── risk-engine.js # Pure scoring module: indicators, score, classification
├── content.js # Page banner overlay for SUSPICIOUS sites
├── block.html # DANGER block page with animated score arc
├── block.js # Block page logic (URL params → safe DOM rendering)
├── popup.html # Action popup dashboard (score, level, indicators)
├── popup.js # Popup logic
├── options.html # Settings page with dark/light mode, thresholds, lists
├── options.js # Settings logic
├── styles.css # Shared CSS custom properties
├── data/
│ └── blocklist.json # 12 sample threat entries (phishing + malware)
├── icons/
│ ├── icon16.png
│ ├── icon48.png
│ └── icon128.png
└── README.md
```
## 架构
### 风险引擎
纯 ES 模块 — 无副作用,不依赖 Chrome API。导出内容:
- `normalizeUrl(raw)` — 解析并标准化输入
- `extractDomain(raw)` — 提取不带 www 的主机名
- `detectIndicators(url, blocklist, allowlist)` — 返回 `{id, label, points, detail}` 对象数组
- `calculateRiskScore(indicators)` — 求和 + 限制在 100 以内
- `classifyRisk(score)` — 返回 `DANGER | SUSPICIOUS | CLEAN`
- `analyzeUrl(url, blocklist, allowlist)` — 完整的组合分析结果
### 后台脚本
- 作为 ES 模块导入 risk-engine.js
- 拦截 `webNavigation.onBeforeNavigate` (仅限主框架)
- 分发逻辑:DANGER → 标签页重定向;SUSPICIOUS → 通知 + content script 消息;CLEAN → 清除 badge
- 维护每个标签页的最近结果缓存,用于弹窗展示
- 处理所有扩展消息路由
### 内容脚本
- 在 `document_end` 时注入到每个 HTTP/HTTPS 页面
- 监听来自后台脚本的 `SWG_SUSPICIOUS` 消息
- 仅使用安全的 DOM API 渲染可关闭的顶部横幅 (不使用带有用户数据的 innerHTML)
- 12 秒后自动消失
### 消息协议
| 消息 | 发送者 | 处理者 | 响应 |
|---|---|---|---|
| `GET_SETTINGS` | popup/options | background | `{settings}` |
| `UPDATE_SETTINGS` | popup/options | background | `{success}` |
| `GET_LAST_RESULT` | popup | background | `{result}` |
| `ANALYZE_URL` | popup | background | `{result}` |
| `GET_STATS` | popup | background | `{stats}` |
| `RELOAD_BLOCKLIST` | — | background | `{success, count}` |
| `SWG_SUSPICIOUS` | background | content | — |
## 设置
| 设置项 | 默认值 | 描述 |
|---|---|---|
| 启用保护 | 开 | 主开关 |
| 可疑通知 | 开 | 分数为 40–79 时的浏览器通知 |
| “仍然继续”按钮 | 关 | 允许绕过 DANGER 拦截 |
| 深色模式 | 开 | 设置页面主题 |
| 危险阈值 | 80 | 判定为 DANGER 的最低分数 (50–100) |
| 可疑阈值 | 40 | 判定为 SUSPICIOUS 的最低分数 (10–79) |
| 自定义拦截域名 | [] | 用户添加的域名黑名单 |
| 白名单 | [] | 始终信任的域名 (绕过所有检查) |
## 局限性
- **仅支持静态本地规则** — 没有实时威胁情报源。如果不手动更新,黑名单会失效。
- **无内容检查** — 仅分析 URL;不检查页面内容、脚本和表单。
- **无 SSL 证书验证** — 未实现 SSL 占位符指标 (需要原生消息传递或 API)。
- **无域名年龄检查** — 检查 WHOIS/注册日期需要外部 API。
- **启发式误报** — 合法的企业网站可能会使用长 URL 或某些关键词。
- **MV3 Service Worker** — 后台脚本可能会在导航之间挂起;状态将从 `chrome.storage.local` 恢复。
- **容易绕过** — 用户可以禁用扩展或使用无痕模式。
## 未来增强
### 高优先级
- **Google Safe Browsing API v4** — 针对 Google 威胁数据库的实时 URL 查询 (需要 API 密钥)
- **VirusTotal URL API** — 将 URL 与 70 多家安全供应商进行交叉比对
- **远程黑名单源** — 可配置的 JSON 源 URL,以设定的时间间隔获取并检查版本
### 中优先级
- **域名年龄启发式** — 通过 RDAP API 标记新注册的域名 (<30 天)
- **SSL 证书检查** — 检测可疑域名上的自签名证书、近期签发的证书
- **同形异义词检测** — 超越基本 Punycode 的 Unicode 外观相似字符检测
- **报告按钮** — 将误报和新威胁提交至后端
- **企业策略** — 支持 `chrome.storage.managed` 用于组织范围的部署
### 长期规划
- **机器学习分类器** — 用训练好的模型取代启发式权重
- **云端同步** — 跨设备的黑名单和设置同步
- **遥测仪表板** — 可视化被拦截的威胁、被拦截最多的域名和趋势
- **白名单建议** — 自动建议放行经常访问的安全网站
- **浏览器历史记录扫描** — 根据更新的黑名单追溯检查已访问的网站
## 安全说明
- 代码库中没有任何 `eval()`
- 不加载远程脚本 (严格的 CSP:`script-src 'self'`)
- 所有用户控制的值均通过 `textContent` 渲染 — 没有 XSS 攻击面
- 没有内联 JavaScript — 所有逻辑均位于外部 `.js` 文件中
- `manifest.json` 中强制执行内容安全策略 (Content Security Policy)
- 在任何拦截逻辑之前检查白名单绕过
## 许可证
MIT — 仅用于教育和演示目的。
标签:Edge扩展, Manifest V3, URL分类, 前端安全, 启发式分析, 威胁情报, 安全浏览器, 安全防护插件, 开发者工具, 恶意软件拦截, 搜索语句(dork), 数据可视化, 本地黑名单, 浏览器扩展, 网址安全检测, 网址过滤, 网络安全, 网络安全插件, 自定义脚本, 警告页面, 调试辅助, 钓鱼网站检测, 隐私保护, 风险拦截, 风险评分引擎