AI PLAY玩法更新持续收录
← 回到更新流

2026-09-08 · 原文发布日

贴个链接就出钓鱼风险评估:多源信号汇总成0-100分

用户在n8n表单提交URL后,流程提取域名并依次查Google Safe Browsing、VirusTotal、RDAP注册信息、crt.sh证书历史和IP归属地,把各信号汇总成0到100的风险分和低中高档位,再让Gemini把技术数据写成大白话结论和一条建议动作,结果记入Google Sheets并推送到Slack,适合团队内部做链接安全自查。

原文要点

原流程(n8n模板19380,iamvaar)用n8n表单收集URL,提取域名并加扫描时间戳;依次查Google Safe Browsing、ip-api.com的IP归属地、RDAP域名注册信息、crt.sh证书记录,再提交VirusTotal并稍等后取分析报告;把各信号聚合成0-100风险分和Low/Medium/High档位,依据包括Safe Browsing命中、VirusTotal检出数、域名年龄和证书历史;随后由Google Gemini(作者写明为Gemini 3.1 Flash Lite)生成大白话结论和一条建议动作,结果写入Google Sheets(Service Account凭据)并推送到Slack(OAuth凭据)。

这次做成什么

搭一条『提交URL→多源信号查询→打分→AI结论→落表+通知』的安全自查流程,并用一个虚构域名手动跑通打分与输出环节;评分规则原文未公开具体公式,本站按信号来源独立设计一套可调整的计分配置。

准备什么

  • n8n实例,可发布n8n Form并向公网API发HTTP请求
  • Google Safe Browsing API Key和VirusTotal API Key(免费层有调用频次限制)
  • Google Gemini(Google PaLM)凭据,可用作者指定的Gemini 3.1 Flash Lite或你账号可用的模型
  • Google Service Account凭据(对目标Sheets有编辑权)和Slack OAuth凭据(有发消息权限)

具体怎么做

  1. 发布表单并规范化输入

    新建n8n Form Trigger,添加一个必填文本字段『待检测URL』,发布表单拿到公开链接。接一个Code节点:用new URL()解析输入,取hostname作为domain(无协议头时先补https://),并附加scan_timestamp字段(当前ISO时间)。解析失败直接回复表单错误,不进入后续查询。

  2. 并行查询五类信号

    用HTTP Request节点分别查询:①Google Safe Browsing Lookup API(POST v4/threatMatches:find,body里放URL,Key放query参数);②ip-api.com/json/{domain}取IP和country/isp;③RDAP(如https://rdap.verisign.com/com/v1/domain/{domain})取注册时间;④crt.sh/?q={domain}&output=json取证书条目数与最早签发时间;⑤VirusTotal POST /api/v3/urls提交URL(URL需base64url编码为ID),Wait节点等约20秒后GET /api/v3/analyses/{id}取stats。五个查询可并联到同一Merge节点。

  3. 按计分配置聚合风险分

    Code节点读取下方计分配置artifact,逐项累加:Safe Browsing命中直接+60;VirusTotal的malicious检出数×8(封顶40);域名年龄小于180天+15、小于30天改为+25;crt.sh无任何证书记录+10;IP归属地与团队预期区域不符(自选名单)+5。总分封顶100,档位:0-29 Low、30-69 Medium、70-100 High。输出score、level、flags数组(记录每条命中的规则)。

  4. Gemini生成大白话结论

    Gemini Chat节点(凭据选Google PaLM,模型按作者说明为Gemini 3.1 Flash Lite,若你账号无此模型则选可用的Flash类模型)传入system提示词artifact和用户消息(JSON格式的全部信号+分数+flags),要求输出两段:一段不超过100字的通俗结论,一条具体建议动作。

  5. 落表并推送Slack

    Google Sheets节点(Append或Update操作)写入一行:时间戳、URL、域名、分数、档位、flags摘要、Gemini结论、建议动作。Slack节点用OAuth凭据发消息到选定频道,消息用『档位emoji+域名+分数+结论』格式,高风险时@值班同事。练习时可先把Slack换成NoOp,只看Sheets结果。

可直接复制的材料

风险计分配置(本站独立设计)

本站设计的示例规则,原文只说聚合依据含四类信号、未给公式;权重和区域名单请按团队情况调整

{
  "scoring": {
    "safe_browsing_hit": 60,
    "virustotal_per_malicious_engine": 8,
    "virustotal_cap": 40,
    "domain_age_lt_180d": 15,
    "domain_age_lt_30d": 25,
    "no_certificate_history": 10,
    "unexpected_ip_region": 5,
    "score_cap": 100
  },
  "levels": {"low": [0, 29], "medium": [30, 69], "high": [70, 100]},
  "expected_ip_regions": ["CN", "HK", "SG"]
}

Gemini通俗结论提示词(本站独立编写)

本站编写的示例提示词,变量在n8n表达式中替换;输出语言可在提示词中指定中文

你是面向非技术同事的安全助手。根据下面的链接检测数据(JSON),输出两部分:
1. 【结论】不超过100字的大白话判断,说明这个链接能不能点、为什么,不要出现英文技术术语。
2. 【建议】一条具体可执行的下一步动作(如『不要打开并转发给IT』『可正常访问』)。

检测数据:
{{scan_result_json}}

只输出这两部分,不要复述原始数据,不要加免责声明。

练习用合成检测结果

本站虚构数据,example-test.com为保留域名,仅用于练习打分逻辑,不代表真实检测结果

{
  "url": "https://pay-secure-verify.example-test.com/login",
  "domain": "pay-secure-verify.example-test.com",
  "scan_timestamp": "2026-09-08T10:30:00.000Z",
  "safe_browsing": {"matches": 1},
  "virustotal": {"malicious": 3, "suspicious": 1, "harmless": 62},
  "domain_age_days": 12,
  "crtsh_cert_count": 1,
  "ip_country": "RU"
}

输入与输出示例

本站虚构演示,分数按上方示例配置手算,未实际调用任何API

输入

表单提交 https://pay-secure-verify.example-test.com/login ,各源返回:Safe Browsing命中1条、VirusTotal 3个引擎报恶意、域名注册12天、crt.sh仅1条证书记录、IP归属RU(不在预期名单)

对应输出

按本站示例配置:60 + 3×8 + 25 + 0 + 5 = 114,封顶100,档位High,flags=[safe_browsing_hit, vt_malicious_3, domain_age_12d, unexpected_region_RU]。Sheets新增一行:2026-09-08T10:30 | pay-secure-verify.example-test.com | 100 | High | ...;Slack推送『🔴 高风险 pay-secure-verify.example-test.com 100分:该链接被多家安全引擎标记为钓鱼,域名注册仅12天。建议:不要打开,立即转发给IT安全组。』

做完检查这些

  • 提交无协议头的域名(如example.com)也能被解析并完整走完全部查询节点
  • Safe Browsing命中时分数至少60,档位必为Medium或High,且flags中包含safe_browsing_hit
  • VirusTotal恶意检出为0且域名年龄大于180天时,总分不超过30,档位为Low
  • Sheets中每行的时间戳、域名、分数与当次扫描输入一一对应,Slack消息中的域名与表单输入一致

容易卡住的地方

  • VirusTotal免费Key每分钟约4次请求,批量测试会触发429,练习时每次扫描间隔至少15秒
  • 分析不是即时完成,提交后不等待直接取报告会拿到queued状态,需保留Wait节点或轮询逻辑
  • ip-api.com免费版仅HTTP且每分钟约45次,商用需换付费方案或其他地理库
  • RDAP不同后缀的注册局地址不同,示例用Verisign的com/net端点,其他TLD需先查IANA引导表
  • 域名年龄依赖RDAP的注册时间字段,部分注册商不返回events,此时年龄规则应跳过而非按0天计

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Analyze URL phishing risk with VirusTotal, Safe Browsing, Gemini, and Slack
原作者
iamvaar
原始发布日期
2026-09-08T09:43:47.994Z
来源
https://n8n.io/workflows/19380