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), 数据可视化, 本地黑名单, 浏览器扩展, 网址安全检测, 网址过滤, 网络安全, 网络安全插件, 自定义脚本, 警告页面, 调试辅助, 钓鱼网站检测, 隐私保护, 风险拦截, 风险评分引擎