{"id":51465736,"url":"https://github.com/lolitide/virusdetector","last_synced_at":"2026-07-06T11:00:26.905Z","repository":{"id":364268143,"uuid":"1265810966","full_name":"Lolitide/VirusDetector","owner":"Lolitide","description":"Chrome/Edge 浏览器扩展，5 规则实时检测银狐木马钓鱼仿冒网站。域名仿冒 · ICP备案核查 · 下载拦截 · 链接分析 · 代码工程化 — 零依赖 Manifest V3。","archived":false,"fork":false,"pushed_at":"2026-07-06T09:45:38.000Z","size":334,"stargazers_count":107,"open_issues_count":3,"forks_count":6,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-07-06T11:00:19.439Z","etag":null,"topics":["anti-phishing","browser-extension","chrome-extension","cybersecurity","download-protection","malware-detection","manifest-v3","phishing-detection","security","silver-fox-trojan","url-analysis"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Lolitide.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-11T05:17:01.000Z","updated_at":"2026-07-06T09:48:46.000Z","dependencies_parsed_at":null,"dependency_job_id":"0578c7a5-0cd5-4d5b-a91c-832e016839c7","html_url":"https://github.com/Lolitide/VirusDetector","commit_stats":null,"previous_names":["lolitide/virusdetector"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/Lolitide/VirusDetector","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lolitide%2FVirusDetector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lolitide%2FVirusDetector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lolitide%2FVirusDetector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lolitide%2FVirusDetector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Lolitide","download_url":"https://codeload.github.com/Lolitide/VirusDetector/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lolitide%2FVirusDetector/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35187632,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-06T02:00:07.184Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anti-phishing","browser-extension","chrome-extension","cybersecurity","download-protection","malware-detection","manifest-v3","phishing-detection","security","silver-fox-trojan","url-analysis"],"created_at":"2026-07-06T11:00:18.941Z","updated_at":"2026-07-06T11:00:26.879Z","avatar_url":"https://github.com/Lolitide.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Virus Detector - 银狐木马检测\n\n\u003e Chrome/Edge 浏览器扩展，实时检测银狐木马（Silver Fox Trojan）钓鱼与仿冒网站。\n\n[![Manifest](https://img.shields.io/badge/Manifest-V3-blue)](https://developer.chrome.com/docs/extensions/mv3/)\n[![Version](https://img.shields.io/badge/Version-2.4.0-alpha.2-orange)](https://github.com)\n\n---\n\n## 功能简介\n\n通过 8 项检测对访问的网站进行实时安全评估。当总分达到 100 分阈值时，自动触发红色警告、桌面通知、下载拦截和警告弹窗。\n\n| 规则 | 最高加分 | 检测内容 |\n| ---- | -------- | -------- |\n| 域名仿冒 | **60** | 5 规则递进 + 去连字符二次检测（精确段匹配、子串包含、关键词堆叠、约束编辑距离） |\n| 压缩包下载 | **40** | 两阶段检测：Phase A 主动扫描页面跨域压缩包链接（上限 30 分）+ Phase B 实际下载拦截（上限 40 分） |\n| ICP 备案缺失 | **50** | 对所有网站检测 ICP 备案号（含 beian.gov.cn 等政府链接提取） |\n| 链接分析 | **70** | Part A（同页链接/死链/重复链接）+ Part B（下载按钮/压缩包链接） |\n| 代码工程化 | **60** | 三信号组合判定（DOM复杂度+框架检测+外部资源），2信号+20，3信号+30；推广页Emoji密度检测最高+30 |\n| 域名年龄评分 | **60** | 基于 RDAP 协议（RFC 9083）的 S 型衰减函数计分，新注册域名更可疑 |\n| 域名年龄减分 | **-20** | 注册时间长的域名可抵消部分可疑分数（条件：当前分数 ≥ 20） |\n| 下载链接跨域 | **30** | 跨域下载 +10，下载域名命中黑名单 +20，新注册域名额外 +10 |\n| 下载域名黑名单 | **加成** | 用户拦截后跨站免疫，命中 +20，L0 主动扫描阶段额外加权 |\n\n**附加功能**：\n\n- **可信平台白名单** — Wiki / 博客 / 代码托管等 UGC 平台的注册域自动跳过仿冒检测，避免误报\n- **用户白名单** — 信任的网站可加入白名单，跳过所有检测\n- **官方网站早期退出** — 域名+ICP 均通过检测后自动跳过后续规则\n- **下载主动扫描** — 页面加载时扫描所有跨域压缩包链接，提前为可疑网站加风险分\n- **下载二次确认** — 压缩包下载被拦截后弹出三选项确认窗口（放行一次 / 信任网站 / 拉黑下载域名）\n- **下载拦截注入** — ≥100 分时注入页面级拦截：精准匹配已知压缩包链接 + 视觉禁用下载按钮 + MutationObserver 动态监控\n- **下载域名黑名单** — 用户拦截的下载域名跨站免疫，90 天自动清理，500 条容量上限\n- **非压缩包检测开关** — 预留设置页接入，可控制是否拦截 `.exe` `.msi` 等可执行文件（默认关闭）\n- **阈值分层** — ≥80 分激活下载确认弹窗，≥100 分激活完整防护（注入拦截 + 警告窗口 + 图标变红）\n- **警告弹窗** — 独立窗口展示风险详情，支持一键跳转官方网站并关闭危险页面\n\n---\n\n## 安装方式\n\n### Chrome\n\n1. 下载本项目源码或 `git clone`\n2. 打开 `chrome://extensions/`\n3. 开启右上角「开发者模式」\n4. 点击「加载已解压的扩展程序」\n5. 选择项目根目录 `VirusDetector/`\n\n### Edge\n\n1. 下载本项目源码或 `git clone`\n2. 打开 `edge://extensions/`\n3. 开启「开发人员模式」\n4. 点击「加载解压缩的扩展」\n5. 选择项目根目录 `VirusDetector/`\n\n---\n\n## 项目结构\n\n```text\nVirusDetector/\n├── manifest.json                      # Manifest V3 扩展清单\n├── README.md\n├── icons/                             # 盾牌图标（16/32/48/128 px）\n├── background/\n│   ├── service-worker.js              # 主协调器 —— 导航监听、下载拦截、消息路由、弹窗调度\n│   ├── scoring-engine.js              # 多规则评分引擎 —— 综合评估与风险定级\n│   ├── domain-database.js             # 120 品牌域名数据库 + 5 规则仿冒检测 + 去连字符二次检测\n│   ├── download-blacklist.js          # 下载域名黑名单 —— 跨站免疫、90 天自动清理\n│   ├── rdap-client.js                 # RDAP 注册信息查询客户端\n│   ├── whois-client.js                # 统一域名查询入口（RDAP 主 + WhoisCX 回退）\n│   ├── cache-manager.js               # chrome.storage.local 缓存管理（24h TTL）\n│   ├── similarity.js                  # SimHash 64 位文本相似度 + 海明距离\n│   └── icp-utils.js                   # ICP 备案号正则匹配（覆盖 34 个省级行政区简称）\n├── content/\n│   └── content-script.js              # 内容脚本 —— 链接采集、ICP 扫描、页面度量采集\n├── popup/\n│   ├── popup.html                     # 工具栏弹窗 UI\n│   ├── popup.css                      # 弹窗样式（深色主题、SVG 图标系统）\n│   └── popup.js                       # 弹窗控制逻辑 —— 状态渲染、白名单操作\n├── warning/\n│   ├── warning.html                   # 独立警告窗口 UI\n│   ├── warning.css                    # 警告窗口样式\n│   ├── warning.js                     # 警告窗口控制 —— 关闭危险页面、跳转安全页面\n│   ├── download-confirm.html          # 下载二次确认窗口 UI\n│   ├── download-confirm.css           # 下载确认窗口样式\n│   └── download-confirm.js            # 下载确认控制 —— 三选项用户决策\n├── test/\n│   ├── test-phishing.html             # 测试页面 —— 触发各项检测规则\n│   ├── test-download.zip              # 最小合法 zip 文件（22 字节）\n│   └── create-test-zip.py             # 测试工具 —— 生成 zip + 双端口服务器\n└── utils/\n    ├── constants.js                   # 评分常量、阈值配置、黑名单参数\n    ├── url-utils.js                   # 域名解析、PSL 主域提取、DoH DNS 查询\n    ├── messaging.js                   # chrome.runtime 消息通信封装\n    └── trusted-platforms.js          # 可信平台白名单 —— UGC 平台跳过仿冒检测\n```\n\n### 技术特点\n\n- **零依赖**：纯原生 JavaScript（ES Modules），无需 Node.js 构建\n- **Manifest V3**：使用 Service Worker 事件驱动架构\n- **通信模型**：Background (Service Worker) ↔ Content Script ↔ Popup 三方消息传递\n- **算法**：SimHash 64 位用于文本相似度检测；域名仿冒使用 4 层递进匹配（不含编辑距离）\n\n---\n\n## 实现方式\n\n### 防御策略\n\n#### 1. 域名仿冒检测（规则一 | 60 分）\n\n采用 4 层递进式匹配，任一层命中即判定为仿冒：\n\n```text\n规则 A   精确段匹配     → deepseek-go.com 拆分为 [deepseek, go, com] → \"deepseek\" 精确命中\n规则 A-2 连字符连接匹配  → team-viewer.us 去除连字符 → \"teamviewer\" 命中品牌关键词\n规则 B   边界包含        → pc-huorong.com.cn 包含 huorong → 命中（关键词 ≥ 4 字符）\n规则 C   关键词堆叠      → google-google-cn-google.hl.cn → \"google\" 在段中出现 ≥ 3 次\n```\n\n域名数据库覆盖 **172 个**品牌，包含 20 个类别：安全软件、浏览器、即时通讯、输入法、办公、视频、音乐、云存储、AI Chat、下载工具、压缩工具、电商、地图出行、支付、开发者工具、系统工具、游戏平台、游戏加速器、新闻资讯、政务服务、教育/高校。\n\n#### 2. 压缩包下载检测（规则二 | 最高 40 分）\n\n采用两阶段递进评分 + 阈值分层防御：\n\n**Phase A — 主动扫描（页面加载时，L0）**：\n\nContent Script 扫描页面上所有 `\u003ca\u003e` 标签，识别指向压缩包文件的链接（同域 + 跨域全覆盖）：\n\n- 筛选跨域链接，按风险分类计分：\n  - 🔴 高危（跨域 + 下载关键词）：+10/个\n  - 🟠 中危（跨域 + 无下载关键词）：+5/个\n- **批量加权**：≥3 个链接时基础分 ×2（钓鱼站典型特征）\n- **域名嫌疑加权**：其他规则已有 ≥30 分时 ×1.5\n- **黑名单加权**：每个命中下载黑名单的链接额外 +10\n- **硬上限**：Phase A 主动得分最高 **30 分**\n\n**Phase B — 被动拦截（实际下载时，L3 兜底）**：\n\n通过 `chrome.downloads.onCreated` 监听下载事件：\n\n- 域名已有 ≥30 分嫌疑 → **+40 分**并取消下载\n- 弱信号 → **+10 分**\n\n最终得分 = max(Phase A, Phase B)，实现\"主动可提前、被动可升级\"。\n\n**阈值分层**：\n\n```text\n评分 \u003c 80             → 放行（绿色图标）\n80 ≤ 评分 \u003c 100       → 取消下载 + 弹出三选项确认窗口（不注入页面拦截）\n评分 ≥ 100            → 取消下载 + 确认窗口 + 注入页面级拦截 + 警告弹窗 + 红色图标\n```\n\n**页面注入拦截（≥100 分触发）**：\n\n- **精准匹配**：已知压缩包链接精确阻断，给出差异化提示\n- **宽泛拦截**：所有危险扩展名（`.exe` `.msi` `.apk` 等）点击即阻断\n- **视觉禁用**：下载按钮置灰 + 移除 `href` 属性（防止右键另存为绕过 IDM）\n- **容器禁用**：常见下载容器（`.dl-btn` `.down_url` 等）内链接全部禁用\n- **移除 `download` 属性**：防止浏览器原生强制下载\n- **红色警告横幅**：页面顶部注入醒目风险提示\n- **MutationObserver**：持续监控动态加载的下载按钮（30 秒窗口）\n- **非压缩包检测开关**：`.exe` `.msi` 等可执行文件是否拦截由 `global_settings` 控制（默认关闭，预留设置页接入）\n\n**下载二次确认弹窗**：\n\n下载被取消后弹出独立窗口，三项选择：\n\n| 选项 | 行为 |\n| ---- | ---- |\n| 仅此次放行 | 通过 `chrome.downloads.download()` 重新发起下载，不持久化 |\n| 信任网站并放行 | 页面域名加入用户白名单 + 清除评分缓存 + 重新发起下载 |\n| 拦截并拉黑下载来源 | 下载域名写入黑名单，跨站免疫，不重新发起下载 |\n\n#### 3. ICP 备案号检测（规则三 | 50 分）\n\n对所有网站进行 ICP 备案号检测，使用正则匹配覆盖中国全部 34 个省级行政区简称：\n\n- 完整的 ICP 备案号格式：`{省份}ICP{备|证}{6-8位数字}号`\n- 同时识别公安备案号：`{省份}公网安备{10+位数字}号`\n- Content Script 通过 6 层扫描获取页面中所有可能包含备案号的文本：footer 元素、ICP/beian 命名元素、底部 30% 区域、所有 `\u003ca\u003e` 链接（含 beian.gov.cn / beian.miit.gov.cn 等政府备案链接）、position:fixed 底部固定栏、TreeWalker 全文本节点遍历（上限 50000 节点）\n\n#### 4. 链接分析（规则四 | 最高 70 分）\n\nPart A（先执行，可叠加）：\n\n| 子规则 | 触发条件 | 加分 |\n| ------ | -------- | ---- |\n| A-1 同页链接 | \u003e= 3 个链接指向当前页（完整 URL 完全一致） | +20 |\n| A-2 死链 | \u003e= 1 个指向不存在子页面的链接（HEAD 请求验证） | +20 |\n| A-3 重复链接 | \u003e= 4 个不同元素指向同一个链接 | +20 |\n| A-3 附加 | 该重复链接为下载链接（含 download/down 等关键词） | +10 |\n\nPart B（仅当 Part A 为 0 时执行）：\n\n| 子规则 | 触发条件 | 加分 |\n| ------ | -------- | ---- |\n| B-a 下载按钮 | 外链绑定在下载按钮上 | +10 |\n| B-b 压缩包链接 | 外链指向压缩包格式文件 | +10 |\n\n#### 5. 代码工程化检测（规则五 | 60 分）\n\n包含两个独立子规则，分数可叠加：\n\n##### 子规则 A：三信号组合判定\n\n前提：页面文本 \u003e 500 字符（排除空白/占位页面）。\n\n- **信号1** — DOM节点数 \u003c 100（页面结构过于简单，不受HTML格式化影响）\n- **信号2** — 无主流框架痕迹（HTML标记 + window全局变量双重检测）\n- **信号3** — 外部资源去重总数 \u003c 5（脚本+样式+图片+字体+媒体，不含同源资源）\n\n组合判定：3/3 = +30（高度可疑），2/3 = +20（中度可疑），0-1 = 0。\n\n##### 子规则 B：关键词预筛选 + Emoji 密度检测（最高 +30 分）\n\n先通过推广/产品关键词（\"下载\"\"产品\"\"软件\"\"download\"\"product\"\"software\"等 49 个中英文关键词）预筛选确认页面是否为推广性质，再计算 Emoji 密度并通过分段线性映射加分：\n\n- pageText 长度 \u003c 100 字符 → 跳过（0 分）\n- 关键词匹配数 \u003c 阈值（默认 1） → 跳过（0 分，非推广页面）\n- 计算密度：`density = (emojiCount / pageText.length) × 1000`（个/千字符）\n- 分段映射：density \u003c 2.0 → 0；2.0 ≤ density \u003c 10.0 → `(density - 2) / 8 × 30`；density ≥ 10.0 → 30（封顶）\n- Emoji 匹配使用 Unicode 属性转义正则 `/\\p{Emoji_Presentation}|\\p{Emoji}️/gu`，覆盖肤色修饰符与零宽连接符序列\n\n设计原理：正常页面 Emoji 密度极低，钓鱼/欺诈推广页面常大量使用 Emoji 吸引眼球，关键词预筛避免对非推广页面的误报。\n\n#### 6. 域名年龄评分（RDAP 协议 | 最高 60 分）\n\n通过 IANA RDAP 引导文件 + 注册局 RDAP 服务器（RFC 9083）查询域名的注册日期，计算已注册天数（`creation_days`），使用 S 型衰减函数计分：\n\n- **直连查询**：从 IANA 引导文件获取 TLD 对应的 RDAP 服务器地址，直接查询注册局\n- **备用代理**：对于无公开 RDAP 服务的 TLD（如 `.cn`），或直连查询超时/失败时，自动回退到 `rdap.ss` 代理服务，该代理内部通过注册局 WHOIS 获取结构化数据\n- **优雅降级**：如代理也查询失败，返回中性结果（`creationDays = -1`），评分引擎按\"注册时间未知\"处理，不影响检测流程\n\n```text\nscore = floor(60 / (1 + (x / (60 × b))^a))\n\n其中 x = creation_days（域名已注册天数）\n     a = 衰减速率参数（默认 2，越大衰减越快）\n     b = 衰减零点参数（默认 1，控制衰减中心位置）\n```\n\n新注册域名（x → 0）：分母 → 1，score → 60（最高可疑）。随注册天数增加，分数逐渐衰减至 0。\n\n#### 7. 域名年龄减分（RDAP 协议 | 最高 -20 分）\n\n对于注册时间足够长的域名，通过减分抵消部分由其他规则产生的可疑分数：\n\n| 注册天数 x | 减分分值 |\n| ---------- | -------- |\n| x \u003c 180 | 0（新域名不减分） |\n| 180 ≤ x \u003c 730 | floor(20 × (x - 180) / 550) |\n| x ≥ 730 | 20（最大减分） |\n\n**执行条件**：仅当当前可疑总分 ≥ 20 时才应用（避免对低分网站的过度减分）。\n\n#### 8. 下载链接跨域检测（RDAP 协议 | 最高 30 分）\n\n检测下载文件链接的域名是否与当前页面跨域，并集成下载域名黑名单：\n\n1. **同主域名** → 不加分（0 分）\n2. **跨域**（不同主域名）→ +10 分\n3. **跨域 + 命中下载域名黑名单** → **+20 分**（替代常规 +10）\n4. **跨域 + 黑名单 + 新注册域名**（`valid_days` \u003c 365 且 `creation_days` \u003c 90）→ **+30 分**\n\n此规则在下载事件触发时异步执行，与规则二协同工作。下载域名黑名单在 L0 主动扫描阶段也会产生额外加权。\n\n### 可信平台白名单（误报抑制）\n\n为避免对合法 Wiki、代码托管、博客等 UGC 平台的子页面误判为仿冒官网，规则一在执行前会先通过可信平台白名单进行过滤：\n\n- **匹配粒度**：提取 URL 的**注册域**（eTLD+1），例如 `minecraft.fandom.com` → `fandom.com`\n- **命中行为**：注册域命中白名单 → **完全跳过规则一**（域名仿冒检测），不添加仿冒分数\n- **其他规则**：规则二~五、域名年龄、下载跨域检测等仍正常运行，不因白名单而跳过\n- **可扩展**：白名单基于 `Set` 实现 O(1) 查找，新增/移除平台只需修改数组字面量\n\n白名单覆盖 **44 个平台**，按类别包括：\n\n| 类别 | 平台 |\n| ---- | ---- |\n| Wiki 农场 | fandom.com, wikia.com, wikimedia.org, miraheze.org, wiki.gg, gamepedia.com |\n| 代码托管 Pages | github.io, gitlab.io, bitbucket.io, sourceforge.io, codeberg.page |\n| PaaS / 静态托管 | netlify.app, vercel.app, herokuapp.com, pages.dev, surge.sh, glitch.me, onrender.com, fly.dev, workers.dev, deno.dev |\n| 博客平台 | medium.com, wordpress.com, blogger.com, blogspot.com, tumblr.com, hatenablog.com, fc2.com, livejournal.com, typepad.com, substack.com, ghost.io, hashnode.dev, dev.to |\n| 文档 / 知识库 | readthedocs.io, notion.site, gitbook.io |\n| 建站 / 个人页 | weebly.com, wixsite.com, jimdo.com, strikingly.com, carrd.co, about.me, linktr.ee |\n\n\u003e **与用户白名单的区别**：用户白名单（弹窗中操作）完全跳过所有 8 项检测规则；可信平台白名单仅跳过规则一（域名仿冒），是一个内置的、面向 UGC 平台的误报抑制机制。\n\n### 评分体系\n\n```text\n规则一  域名仿冒            +60 ──→\n规则二  压缩包下载          +40 ──→   (Phase A 主动扫描 +30 cap, Phase B 被动下载 +40)\n规则三  ICP 备案缺失        +50 ──→\n规则四  链接分析            +70 ──→  初步总分\n规则五  代码工程化          +60 ──→       │\n域名年龄评分                +60 ──→       ├── ≥ 100 → 红色徽章 + 桌面通知 + 警告弹窗 + 注入拦截\n域名年龄减分                -20 ──→       ├── ≥ 80  → 下载确认弹窗激活（取消下载 + 三选项）\n下载链接跨域                +30 ──→       └── \u003c 80  → 绿色徽章显示分数\n下载域名黑名单              加成 ──→\n\n优化：\n  - 可信平台白名单：注册域命中 → 规则一自动跳过，避免 UGC 平台误报\n  - 规则一 + 规则三均安全 → 跳过规则四/五（官方网站早期退出）\n  - 域名年龄减分仅在当前总分 \u003e= 20 时应用（避免低分网站过度减分）\n  - 下载域名黑名单 → 跨域检测从 +10 提升为 +20，主动扫描阶段额外加权\n```\n\n### 插件功能\n\n#### 用户白名单系统\n\n用户可将信任的网站加入白名单：\n\n- 工具栏弹窗中点击「加入白名单」→ 域名被持久化到 `chrome.storage.local`\n- 白名单中的网站**完全跳过所有规则检测**\n- 工具栏图标右下角显示蓝色对勾徽章\n- 弹窗显示绿色对勾 + 提示文字\n- 支持一键移出白名单并立即重新触发检测\n\n#### 缓存策略\n\n- 检测结果缓存于 `chrome.storage.local`，TTL = 24 小时\n- Content Script 发回新数据时自动绕过缓存更新\n- 清除白名单时同步清除对应域名的缓存\n\n#### 弹窗去重\n\n- 同一标签页 5 秒冷却期，避免重复弹窗\n- 同域名不重复弹出警告窗口\n\n#### 消息通信\n\n15 种消息类型覆盖 Background ↔ Content Script ↔ Popup ↔ Warning 四方通信：\n\n| 消息类型 | 方向 | 用途 |\n| -------- | ---- | ---- |\n| `PAGE_ANALYSIS_RESULT` | Content → Background | 页面分析数据上报 |\n| `REQUEST_PAGE_TEXT` | Background → Content | 请求重新采集页面数据 |\n| `GET_TAB_STATE` | Popup → Background | 查询当前标签页状态 |\n| `ADD_TO_WHITELIST` | Popup → Background | 添加域名到白名单 |\n| `REMOVE_FROM_WHITELIST` | Popup → Background | 从白名单移除域名 |\n| `CHECK_WHITELIST` | Popup → Background | 查询域名是否在白名单 |\n| `DOWNLOAD_CONFIRMATION` | Warning → Background | 下载确认弹窗用户选择 |\n| `GET_DOWNLOAD_BLACKLIST` | Popup → Background | 查询下载域名黑名单 |\n| `REMOVE_DOWNLOAD_BLACKLIST` | Popup → Background | 移除下载黑名单条目 |\n\n---\n\n## 所需权限\n\n| 权限 | 用途 |\n| ---- | ---- |\n| `activeTab` | 读取当前活跃标签页信息 |\n| `storage` | 持久化评分状态、白名单、缓存 |\n| `downloads` | 监听下载事件、取消危险下载 |\n| `scripting` | 注入 Content Script 与下载拦截脚本 |\n| `alarms` | 定时任务支持 |\n| `notifications` | 桌面风险通知 |\n| `webNavigation` | 监听页面导航以触发分析 |\n| `\u003call_urls\u003e` | 全部网站覆盖（检测与注入所需） |\n\n---\n\n## 开发说明\n\n### 代码注释规范\n\n所有模块均包含文件级 JSDoc 注释块，说明模块职责与核心逻辑。关键函数包含参数、返回值和使用说明。\n\n### 扩展调试\n\n1. 打开 `chrome://extensions/`\n2. 找到本扩展，点击「Service Worker」链接查看后台日志\n3. 右键扩展图标 →「检查弹出内容」查看弹窗调试信息\n\n### 图标系统\n\n弹窗 UI 使用内联 SVG 图标系统，定义在 `popup/popup.js` 的 `ICONS` 常量中。所有图标均可通过修改对应 SVG 字符串来更换，无需依赖外部资源。\n\n## Star History\n\n\u003ca href=\"https://www.star-history.com/#Lolitide/VirusDetector\u0026type=date\u0026legend=top-left\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=Lolitide/VirusDetector\u0026type=date\u0026theme=dark\u0026legend=top-left\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=Lolitide/VirusDetector\u0026type=date\u0026legend=top-left\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=Lolitide/VirusDetector\u0026type=date\u0026legend=top-left\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n---\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flolitide%2Fvirusdetector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flolitide%2Fvirusdetector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flolitide%2Fvirusdetector/lists"}