链接看起来可疑?就用 url.vet 检测一下。
开源 URL 安全检测引擎 — 粘贴任意链接,实时获取信任评分、完整可解释的检测报告,以及带有页面预览的可分享安全报告。
English | 中文
⚡ 快速开始 · ⚙️ 检测引擎 · 🏛 架构 · 📚 文档 · 🤝 贡献
英文名 URLvet · 原名 SafeSurf
粘贴 URL → 实时获取信任评分、检测结论与详细报告。
在线体验:https://url.vet
git clone https://github.com/abhizaik/urlvet.git
cd urlvet
make start打开 Web UI:localhost:3000
详细配置指南:docs/setup.md
- 实时扫描,即时出结果
- 18 个分析器,33 个信号,完全可解释
- HTTP API + Web UI + Chrome 扩展
- 可解释评分(无黑盒 ML 模型)
- 简单的 Docker 一键部署,完全可自托管
| 功能 | url.vet | VirusTotal | Google Safe Browsing | URLScan.io | CheckPhish |
|---|---|---|---|---|---|
| 实时抓取,即时结果 | ✅ | 部分 | ❌ | 部分 | 部分 |
| 解释每条检测结论 | ✅ | 部分 | ❌ | 部分 | 部分 |
| 对新手友好的界面 | ✅ | 部分 | 部分 | 部分 | 部分 |
| 凭据表单检测 | ✅ | ❌ | ❌ | 部分 | ✅ |
| 跟踪重定向链 | ✅ | ✅ | ❌ | ✅ | ✅ |
| 详细技术洞察 | ✅ | ❌ | ❌ | ✅ | 部分 |
| 页面实时预览 | ✅ | ❌ | ❌ | ✅ | ✅ |
| AI/ML 检测 | ❌ | ✅ | ✅ | 部分 | ✅ |
| 已知钓鱼数据库覆盖 | 部分 | ✅ | ✅ | 部分 | 部分 |
| 批量扫描多个 URL | ❌ | ✅ | ✅ | ✅ | ❌ |
| 浏览器保护 | ✅ | ✅ | ✅ | ✅ | ❌ |
| 开源 | ✅ | ❌ | ❌ | ❌ | ❌ |
快速扫描器(如 Google Safe Browsing)仅做数据库查询,无法解释结论也不支持实时扫描。深度爬虫(如 URLScan.io)速度太慢。url.vet 填补了这一空白——实时分析、逐信号解释,而且完全开源。
- 普通用户:检测可疑链接
- 开发者:集成 URL 分析能力
- 安全团队:构建检测流水线
- 安全研究人员
通过 HTTP 分析 URL:
curl "http://localhost:8080/api/v1/analyze?url=https://example.com"示例响应:
{
"url": "https://example.com",
"trust_score": 100,
"verdict": "Safe",
"reasons": {
"good_reasons": [...]
}
}完整响应结构 → docs/api.md#example
18 个并发 goroutine 运行于 7 个信号类别,产生 33 个独立信号。每项检查都会输出一条原因字符串(正面、负面或中性),因此最终评分始终完全可解释,没有黑盒判定。
评分公式:finalScore = clamp(50 + (trustScore − riskScore) × 0.5) → 高风险 < 30 · 可疑 30–64 · 安全 ≥ 65
50 为中性基线——没有任何信号的 URL 得分恰好为 50(可疑),这是对未知 URL 的正确默认值。信任信号拉高评分,风险信号拉低评分,各以 0.5× 加权,两者互不压制。公式运算前,两个分数分别被限制在 0–100 之间,防止单一灾难性信号淹没其他所有信息。
URL 信号(8 项检测)
- 以原始 IP 地址作为主机名(常见规避手法)
- Punycode / IDN 编码(同形域名欺骗)
- URL 缩短服务(隐藏真实目标)
- URL 长度过长(异常长的 URL 用于隐藏目标或混淆解析器)
- URL 路径深度过深(深层嵌套路径用于掩盖恶意端点)
- URL 路径中包含钓鱼关键词(login、verify、secure、update……)
- 子域名数量过多
- 主机名中包含非 ASCII Unicode 字符(IDN 同形攻击,例如使用西里尔字母 а 的 аpple.com)
HTTP / 网络(4 项检测,单次 HTTP 请求)
- 重定向链跳转次数
- 跨域重定向(最终目标与源域名不同)
- HSTS 支持
- HTTP 状态码
DNS(3 项检测)
- NS 记录有效性
- MX 记录有效性
- IP 解析
TLS / SSL(2 项检测,单次 TLS 握手)
- TLS 存在性与主机名匹配
- 证书链——有效性、过期时间、签发机构、CT 日志状态、已知恶意指纹
域名情报(6 项检测)
- 域名排名(在全球 Top 100 万列表中的位置)
- TLD 信任度 / 风险度 / ICANN 状态
- 通过 WHOIS 获取域名注册时间(新注册 = 高风险)
- DNSSEC(DNS 响应的加密完整性)
- Shannon 熵值评分(标记算法生成的域名)
- 对 500+ 知名品牌的仿冒域名与组合仿冒检测
内容分析(8 项检测)
- 未排名或新注册域名上的登录表单
- 支付表单(信用卡、CVV 字段)
- 个人信息表单
- 隐藏的
<iframe>(凭据窃取 / 点击劫持载体) - 跟踪像素(1×1 隐藏图片)
- 页面内容中的品牌名称与托管域名对比
- 表单提交至外部域名
- 未加密 HTTP 上的密码字段
威胁情报(2 项检测)
- PhishTank 已确认钓鱼(社区验证)
- PhishTank 已举报钓鱼(待验证,3 小时缓存)
- 基于启发式的检测可能产生误报
- 无 ML 模型(有意为之,优先保证可解释性与可审计性)
本工具不提供安全保证,请与其他防御手段配合使用。
四个容器化服务运行于共享的 Docker bridge 网络中。Go 后端是唯一对外部 API 发起出站请求的服务——前端、Chrome 和缓存均为严格内部通信。
| 服务 | 职责 |
|---|---|
urlvet-web |
SvelteKit UI — :3000(生产)· :5173(开发) |
urlvet-backend |
Go REST API 与分析引擎 — :8080 |
urlvet-chrome |
无头 Chrome — WebSocket :9222 |
urlvet-valkey |
Valkey(兼容 Redis)— :6379,LRU 缓存,持久化卷 |
- 通过 UI 或 REST API 提交 URL
- 后端验证并规范化 URL(缺少协议头时自动推断)
- 检查 Valkey 缓存——命中则立即返回完整结果,无需重新分析
- 未命中时:18 个 goroutine 通过
sync.WaitGroup并发启动;每个任务的 panic 单独恢复,不影响整体请求 - 收集结果 → 汇总评分 → 分配结论
- 完整结果缓存至 Valkey(TTL 24 小时)并记录到扫描历史
- 返回响应——信任评分、检测结论、逐信号原因、重定向链、页面截图、各任务耗时
server/
cmd/urlvet/ 入口点
internal/analyzer/ goroutine 运行器、任务定义、评分汇总
internal/service/
checks/ 18 个独立分析器实现
screenshot/ 无头 Chrome 集成
cache/ Valkey 客户端
threatfeeds/ PhishTank 客户端
typosquat/ 品牌相似度引擎
web/website/ SvelteKit UI
web/chrome-extension/ 浏览器扩展
docker/ 开发与生产 Compose 配置
docs/ API、部署、架构、安全文档
| 部署配置 | 本地与 Docker 部署、Makefile 命令 |
| 环境变量 | 所有环境变量说明 |
| 生产部署 | VPS、反向代理、防火墙 |
| API 参考 | 接口、频率限制、响应示例 |
| 架构说明 | 服务、请求生命周期、检测引擎 |
| 安全 | 管理员认证、密码哈希 |
| 性能 | 延迟、资源占用、调优 |
| 设计决策 | 为什么这样构建 |
| 运维 | 缓存、日志、备份 |
| 词汇表 | 术语与缩写 |
交互式 API 文档(Swagger UI):api.url.vet/swagger/index.html
如果您在学术或研究工作中使用了本项目,请引用 — 参见 CITATION.cff。
Copyright (C) 2021–2026 Abhishek K P
url.vet 采用双重许可:
- 社区版 — GNU Affero General Public License v3.0。可免费使用、修改和自托管。任何通过网络运行的修改版本必须向用户开放其源代码。
- 商业版 — 为无法遵守 AGPL-3.0 的组织(如闭源 SaaS)提供单独的商业许可证。
- 发现 Bug?→ 提交 Issue
- 有问题或想法?→ 发起讨论
- 想贡献代码?→ CONTRIBUTING.md
如果这个项目对您有帮助,欢迎点个 Star ⭐


