8275 字
41 分钟
我的站被一个「安全插件」拉黑了,顺便聊聊 3DM 也躺枪这件事

今天上午,有个读者加我 QQ,说打开我的博客会跳一个安全警告,问我是不是电脑中毒了。

我当时第一反应是:不会吧,我这站连后端都没有,纯静态挂在 Cloudflare Pages 上,能有什么毒。

结果我自己装上那个插件一试。好家伙,比我预想的还离谱。

访问 zakofox.cn 时弹出的警告

到底弹了什么#

地址栏敲下 zakofox.cn,页面还没完全渲染出来,屏幕顶部先横过来一条警示条:

风险警告:该网站被检测为疑似钓鱼/恶意网站,请勿输入个人信息或下载任何文件!

紧接着正中弹出一个卡片,标题写着「安全警告 - 银狐木马检测」,正文一行大字:

该网站被识别为疑似钓鱼/恶意网站!

下面还有一句「请勿输入任何个人信息、账号密码或进行支付操作」,再往下是一个表格,列着「当前网站:zakofox.cn」「检测时间:2026/9/27 10:09:30」,最后贴了两条「安全建议」:不要在可疑网站输入个人信息、不要下载或运行该网站的任何文件。

整个过程行云流水,措辞相当有威慑力。要不是这站是我自己一行行写出来的,我可能真就信了。

说句实话,看到「疑似钓鱼」四个字的时候我确实有点上火。我这站放着的技术教程、游戏杂谈,最敏感的内容大概就是那篇 Steam 安装教程。它跟钓鱼、跟银狐木马、跟「输入账号密码」这件事,隔着十万八千里。

装的到底是什么东西#

冷静下来之后,我先去把这个插件查了一遍。

它叫「银狐木马检测 - Virus Detector」,作者是 B 站的酪酪肽,源码开源在 GitHub,Firefox、Edge、Chrome 都有版本。

平心而论,这个插件要解决的问题是真实存在的。银狐木马这两年确实猖獗,北大计算中心转过国家计算机病毒应急处理中心的通告,它主要盯着企事业单位的管理、财务人员,手法是把木马伪装成快捷方式、压缩包、文档,再用一批仿冒正规软件的钓鱼站做分发。这类攻击对普通人来说确实很难靠肉眼识别,有工具帮忙盯一下不是坏事。

真正让我想认真聊一聊的,是它「怎么盯」。

我把它的源码拉下来读了一遍#

抱怨之前,我决定先把判定逻辑搞清楚。光靠猜是没用的,猜出来的东西站不住脚。

好在这个插件是开源的,我把仓库整个 clone 了下来。规模比我预想的认真得多:55 个 JavaScript 文件、一万多行代码,核心的打分引擎 background/scoring-engine.js 就有 1776 行;域名仿冒检测单独配了一个 1741 行的品牌库;此外还有专门处理 Whois/RDAP 查询、ICP 备案核验、下载黑名单、导航守卫的模块。

所以这篇文章里出现的每一个分数,都不是我估的,是我把它的打分引擎直接 import 出来、喂进我站点的真实页面数据、亲手跑出来的。跑之前我先列了几条「我猜它为什么拦我」的假设,跑完之后发现——大部分猜错了。

先说被推翻的那条。我原本以为,是我页脚挂着「萌ICP备20250341号」和「假ICP备1202640号」两个玩笑性质的备案号,被插件识破是伪造备案,所以重罚。

真去读源码才发现不是。它的备案号识别用的是「省份简称 + ICP备 + 数字 + 号」的正则,省份简称是一个固定列表:京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤川青藏琼宁。「萌」和「假」都不在列表里,匹配不上。

也就是说,我页脚那两个备案号,在这套插件眼里等于不存在。它的结论不是「伪造备案」,而是简简单单一句「没检测到备案号」。

这个细节是后面一切的前提,先记住它。

它是怎么打分的#

我一开始以为这类插件就是查黑名单:命中了一个恶意域名库,就报警。真去翻源码才发现不是——它是给每个页面跑一套打分,把域名特征、页面代码、下载行为、备案状态、域名年龄全部量化,加总之后跟阈值比。总分越高越可疑。

这套打分的维度大概是这样:

检测维度最高分它具体看什么
域名仿冒60形近混淆、拼音变体、typosquat、页面 title 里声称的品牌、ICP 备案、域名年龄,分级评定(STRONG / WEAK)后多特征联动加分
链接分析70同页链接、死链、重复链接,以及页面上的下载按钮和压缩包链接
代码工程化检测60DOM 复杂度、前端框架痕迹、外部资源引用、异常 JS 引用;凑够 2 个信号加 20,3 个以上加 30
域名年龄60通过 RDAP 协议(RFC 9083)查注册时间,用 S 型衰减函数算分,新域名更可疑;反过来,注册够久的域名可以减分(前提是当前分数已 ≥ 20)
ICP 备案缺失50全站扫描 ICP 备案号(连 beian.gov.cn 这类政府链接也会提取),查不到就扣分
压缩包下载40两阶段:先在页面加载时主动扫描跨域压缩包链接(上限 30 分),再到实际下载动作时拦截(上限 40 分)
下载链接跨域30跨域下载 +10,下载域名命中黑名单 +20,新注册域名再 +10
下载域名黑名单加成用户拉黑过的下载域名跨站免疫,命中 +20,在主动扫描阶段额外加权

光看这张表,其实很难说哪一条是「错」的。仿冒域名确实该拦,钓鱼站确实爱用压缩包分发。问题出在这些规则是怎么组合的,以及它们在什么情况下会失效。

除了打分,插件还叠了几层机制:

  • 白名单与早期退出。 Wiki、博客、代码托管这类 UGC 平台的注册域会自动跳过仿冒检测;用户自己信任的站点可以加白名单,直接跳过全部检测;如果一个网站域名和 ICP 都过了,后续规则也不再跑。
  • 阈值分层。 累计到 80 分,弹下载确认框;到 100 分,进入完整防护状态——警告弹窗、图标变红、页面级拦截一起上。
  • 下载拦截注入。 这是我觉得最「重」的一环。分数到 100 之后,插件会往页面里注入拦截逻辑:精准匹配已知的压缩包链接、把下载按钮视觉禁用,还挂了一个 MutationObserver 盯着 DOM 变化,防止页面动态插入新的下载链接绕开检测。
  • 下载二次确认。 压缩包被拦下时弹三选项:放行一次、信任这个网站、或者拉黑这个下载域名。拉黑的域名会跨站生效,黑名单存 500 条,90 天自动清理。
  • 更新检测。 走 Cloudflare Worker 代理去查 GitHub Releases,靠边缘缓存和 ETag 条件请求避开 GitHub API 按来源 IP 的限速,直连 API 作为回退;如果是商店渠道安装的,就关掉自检查,交给浏览器商店自己更新。
  • 一个还没启用的开关。 设置页预留了「非压缩包检测」,可以控制要不要拦 .exe、.msi 这类可执行文件,默认关闭。

还有一个容易被忽略的设计:插件内置了三档灵敏度预设。低灵敏度把触发阈值抬到 150 分,高灵敏度压到 70 分,同时把各项规则的权重整体调高。同一套代码,换个档位就是完全不同的判断标准。

机制听完,我的判断很清楚:这不是一个草率的工具,作者是真的想过这些情况的。白名单、早期退出、可信档案降权,这些都是为了压误报加的补丁。

但也正因为它是「打分制」,它的失效方式就变得很隐蔽——它不需要哪一条规则写错,只需要几个本来不相关的维度在同一张页面上同时得分。

我用它的引擎跑了一遍自己的站#

下面是我实测的结果。说实话,看到明细的时候我有点意外,因为我原本以为的事,基本都没发生。

域名仿冒:0 分。 它的品牌库里有 141 个条目,我喂进 zakofox.cn,detectSpoof() 返回的是 null——这个域名跟任何品牌都不像。

链接分析:0 分。 首页 158 个链接里,指向页面自身的只有 3 个(不满足「≥8 个同页自指」这条),没有死链,没有压缩包链接。

代码工程化:0 分。 我原以为这条会重罚我——静态博客嘛,一堆外链脚本、一堆压缩产物,看着就很「工程化」。结果它的判定逻辑是:DOM 节点数低于 100 才算「可疑地简单」,外部资源少于 5 个才算「单薄」。我的首页有 632 个 DOM 节点、16 个外部域名,还带着 Astro 的 _astro 框架痕迹——三条全部反向达标,0 分。

压缩包下载:0 分。 我站上没有任何压缩包或可执行文件。

加起来:0 分。

一个没有仿冒域名、没有可疑链接、没有下载、结构完整的静态博客,在这套规则的前五项里拿了个干干净净的零分。如果故事到这里结束,它会安安静静地判我安全。

但还有两项,它俩才是主角。

第一项:8 月 31 日,我换了域名#

今年 8 月 31 日,我把博客从 240900.xyz 迁到了 zakofox.cn。

换域名的时候我担心的全是 SEO 那些事:搜索引擎要重新收录、外链权重要重新累积、老读者可能找不到新地址。我完全没想过,会是一个安全插件先把新域名「算」了一遍。

插件的域名年龄评分算法是这样的(utils/constants.js):

得分 = floor(60 / (1 + (注册天数 / 114) ^ 2.2))

这是一个衰减函数:域名越新,得分越高,上限 60 分。我把几个关键天数代进去算了一下:

域名注册天数域名年龄得分
3 天+59
14 天+59
27 天+57
30 天+56
60 天+48
90 天+37
180 天+16
365 天+4
730 天0

看到那张表的时候我愣了一下。我 8 月 31 日换的域名,读者 9 月 27 日撞上的警告——中间正好 27 天。

27 天,+57 分。

而如果我当时没换域名呢?240900.xyz 是 4 月 19 日注册的,到 9 月 27 日是 161 天,按同一个公式算出来是 +19 分。

换一次域名,我从 +19 变成了 +57。代价是 38 分。

38 分是什么概念?这套规则的总阈值是 100 分。也就是说,光是一个「换域名」的动作,就吃掉了将近四成的触发额度。

而且这个分数会自己随时间下降:再过三个月(域名满 117 天),它掉到 29 分;满 180 天,掉到 16 分;满一年,只剩 4 分。换句话说,这个误报会自己消失,只要我等。等时间把 57 分磨成 4 分,插件自然就放过我了。

这大概是我见过最荒谬的一种「自证清白」——你不需要改任何东西,你只需要变老。

第二项:.cn 后缀 + 没检测到备案#

第二项扣分就是前面那个伏笔。

插件的备案检测里有一条分支,判断逻辑是:如果域名是 .cn 体系(正则 /(^|\.)cn$/i),那么不管页面上写没写备案号,都直接进入「未检测到 ICP 备案号(中国域名,受 ICP 备案制度管辖)」这个分支,扣 50 分。

理由本身站得住:.cn 域名在国内受 ICP 备案制度管辖,没有备案确实是个信号。

但这条规则的前提和我站的情况对不上。我页脚是挂着备案号的,只是那两个号来自 icp.gov.moe(二次元圈子的玩票备案)和 fakeicp.top(一个访问量统计挂件),前缀是「萌」和「假」——不在插件认得的省份简称列表里,于是被当成不存在。

我也不打算辩解这个。玩票备案不是真备案,这个我心里清楚。我想说的是另一件事:

这条 50 分的扣分,本来是设计成可以被「降权」的。

源码里给它留了三个减分项(background/scoring-engine.js 的 _applyIcpDeductions):

  • 域名注册超过 730 天:减 20
  • 页面 title 没声称任何品牌:减 10
  • 页面存在可信外链(GitHub、GitLab、MDN 这类攻击者难以伪造的托管平台):减 10

减到最低还剩 10 分。

我的站命中了后两条——标题是「临明小狐狸の小窝」,没冒充谁;页脚挂着我的 GitHub 仓库链接,算一个可信外链。所以是 50 − 10 − 10 = 30 分。

第一条减 20 的那条,要求域名注册超过 730 天。我 27 天。

又是换域名。

算到这里,我其实还是「安全」的#

把账加一下:

项目分数
域名仿冒0
链接分析0
代码工程化0
压缩包下载0
ICP 备案缺失+30(本该 50,被降权减到 30)
域名年龄+57
合计87
阈值100

87 < 100。

我把这个结果跑出来的时候反复确认了三遍。按这套规则的字面逻辑,我不该被拦。分数离阈值还差 13 分,插件给我的判定是绿色的 safe。

那读者看到的那个警告,到底是怎么弹出来的?

那它为什么还是拦了我#

我顺着调用链往下追,追到 service-worker 里的一段异步逻辑,才算把最后一块拼图补上。

插件并不是一次性算完就结束的。它先做一轮「同步评分」(就是上面那 87 分),然后另外发起一次 ICP 备案接口查询,拿真实备案库的结果回来再修正一遍分数。这个设计本身是对的:页面没写备案号不等于没备案,去官方库核一下更准确。

它调用的接口是 uapis.cn,我把我的域名丢进去试了一下:

{"code":"200","domain":"zakofox.cn","serviceLicence":"查询失败","msg":"查询成功"}

接口回答得很干脆:查不到备案记录。

于是插件拿到这个结果,重新执行了一次「规则三」。而问题就出在这一步——这次重算,它没有把前面那个降权档案传进去。

同步阶段调用的时候传了 8 个参数(scoring-engine.js:197),最后一个是降权档案;可异步重算这次只传了 7 个(service-worker.js 里那段「重新执行规则三」),降权档案的位置是空的。

结果就是:同步阶段算出 30 分(50 减掉 20 分降权),异步重算直接回到 50 分,那两条本该生效的减分,全丢了。

我把这个路径也跑了一遍:

阶段规则三域名年龄总分判定
同步评分(页面文本扫描)30+5787safe
异步 ICP 接口核验后50+57107⚠️ warning

107 ≥ 100,警告弹出来了。

也就是说,把我推过那条线的,不是我的站上有什么可疑的东西,而是插件自己的二次核验丢了一个参数。它第一次判我 87 分安全,第二次判我 107 分危险,两次之间我的页面一个字都没改。

这也解释了为什么有人被拦、有人没事#

写到这里我顺手多试了几个组合,发现有几种情况会改变结果:

如果 ICP 接口没返回结果。 接口挂了、超时了、或者被限流了(apihz 那家公开接口限制每分钟 10 次),插件会直接跳过这次修正,分数停在 87,判定安全。同样是访问我的站,接口通不通,决定了你看到警告还是看到页面。

如果页面 title 里带品牌词。 我拿那篇 Steam 教程实测,标题是「如何正确安装Steam」——「Steam」正好在它的品牌库里,于是「未声称品牌」那 10 分降权不生效,同步分数变成 40 + 57 = 97。离阈值只剩 3 分。

如果域名年龄缓存是空的。 首次访问时 WhoIs 还没返回,同步阶段域名年龄按 0 算,总分只有 30。等 WhoIs 回来补上 57,再等 ICP 接口把规则三推到 50,才凑成 107。

这些变量叠在一起,就出现了那个我一直觉得奇怪的现象:同一个站、同一天,有人打开弹警告,有人打开没事,有时候刷一下又变了。它不是「在重新评估」,是这几次异步修正谁先谁后、谁成谁败的问题,而 100 这条线就卡在 87 和 107 中间。

差 7 分就翻盘。

那它到底抓到什么了#

回头看这 107 分的构成,我觉得挺说明问题的。

它没有在我的站上抓到任何一次「可疑行为」:没有仿冒、没有钓鱼表单、没有压缩包、没有诱导下载、没有可疑脚本。前五项规则全是 0。

它抓到的只有两件事:我在 27 天前换了个域名,以及我用的是 .cn。

作者在源码注释里写了一句话,我完全同意:

仅域名相似(无其他可疑特征)远不足以触发警告阈值(100),必须「域名相似 + 内容声称品牌 / 无备案 / 新域名 / 诱导下载」等多特征聚合。

这句话的意思是,作者很清楚单独一条弱信号不该定罪,所以他设计了「多特征聚合」。但问题在于:再弱的特征,聚合起来也会过线。 我这两条都是弱信号——.cn 没备案是弱信号,域名新是弱信号——单独看每条都不该报警,可它们一个 +50 一个 +57,加起来就过线了。

作者在 8 月发过一版重构,更新日志里写着:

仿冒检测评分体系重构 —— 从「命中即判定」到「分级嫌疑 + 跨规则联…」

「命中即判定」这五个字,把之前误报频发的原因交代得很清楚:碰到某一条规则就直接定性,不做交叉验证,不考虑上下文。那次重构就是在修这个问题,方向是对的。

但「分级嫌疑」修的是「一条强信号误伤」,没有修「多条弱信号叠加」。把一个正常站点拆成八项来打分,每一维度的权重可能都调得很克制;可对站长来说,结果是照样被拦——无非是以前被一条规则打死,现在被两条规则凑死。

顺带说一个挺讽刺的细节。插件为了省事,加了一道「下载意图闸门」:只有页面出现「下载」「install」「setup」这类词,才值得跑完整检测。我那篇讲 Markdown 的文章,标题里有「down」,被它当成了下载信号;而真正跟下载有关的首页反倒因为关键词不够密集差点没触发。用一个词表去判断「这个页面是不是在给人发东西」,本身就是一件很容易走样的事。

3DM 也被拦了#

本来我以为是我这站的什么问题,直到我拿同一个插件去访问 3DM 的软件站。

访问 soft.3dmgame.com 时的同款警告

一模一样的横幅,一模一样的卡片,一模一样的「该网站被识别为疑似钓鱼/恶意网站!」,连「安全建议」那两条都一个字没差。

3DM 是什么体量的站,不用我多介绍。一个在国内单机游戏圈存在了二十年的老站,被同一套规则判定成「疑似钓鱼」。这就不是我的站有什么问题了,这是这套规则本身的问题。

而且这个例子恰好补上了我论证里的一块拼图。我把 3DM 的页面也扒下来算了一遍:它的域名足够老,域名年龄这一项应该拿 0 分甚至能拿满 20 分减分;可它的正文里「下载」「免费下载」这类词出现了十几次,密度远超闸门阈值,直接进入完整检测。

那就说明,把 3DM 顶过 100 分的不是域名年龄,而是另外那几项:压缩包链接(规则二的跨域压缩包扫描)、满屏的下载按钮(规则四)、以及一大批压缩产物和外部资源(规则五的代码工程化)。这些恰恰是任何一个软件下载站都躲不掉的东西。

一个以「下载软件」为核心业务的站,被一个专门检测「下载行为」的规则判成了钓鱼站。这里面的错位,不需要我再多解释。

顺带说一句,去它的 issue 区翻一圈,误报反馈堆了一串没人处理。这说明被拦的远远不止我和 3DM 两家。只不过大多数站长要么没发现,要么发现了也懒得折腾,默默把流量损失咽下去了。

这种误报的代价,基本都由站长承担#

顺着前面说下去。这类「安全工具」出错的时候,成本是怎么分配的?

插件这边:用户点一下「此报告有误」,汇总进 issue 列表,运气好能排进下个版本的修复计划。作者确实在迭代,这一点我不否认。

站长这边,损失是实打实的:

流量。 每一个被吓走的访客都是净损失。博客这种站靠的就是自然流量和回头客,没有投放,没有买量,掉一个是一个。而且这种流失是无声的。你既看不到跳出率异常的原因,也等不到对方来问你一句。

品牌。 读者看到「恶意网站」四个字,多半不会先怀疑插件,而是先怀疑这站。这个印象很难消除。哪怕插件下周就修好了,那个读者的记忆不会跟着修好。

时间。 要发现被拦(大多数站长根本不知道)、要复现、要判断是不是自己的问题、要满世界找反馈渠道、要斟酌怎么写才不会被当成无理取闹。整套跑下来,半天没了。我这次还多花了一整天去读它的源码——因为不读源码,我连自己被扣在哪一项上都不知道。

还有一笔隐形账:域名。 我这次换域名,成本原本只算 SEO 那一栏。现在得再加一栏——新域名在前两年里,会持续被各类年龄敏感的安全规则当成减分项。而且这条规则不是它一家在跑,域名年龄是个很通用的风控特征。也就是说,任何一个新站、任何一次迁移,都在默默承担这笔费用,而且没人会告诉你。

而这一切的起因,只是一个自认还在「可能误报」阶段的工具,把我的站判成了「恶意」。

有一点值得单说:这套机制里,站长是「不可见」的。插件有用户白名单,用户可以手动信任我;有下载域名黑名单,用户可以放行或拉黑;甚至还有 MutationObserver 盯着页面防止绕过拦截——所有这些机制都是为「用户」设计的,唯独没有一条是给「被检测的站长」用的。站长既看不到自己哪一项被扣了分,也没有申辩的地方。

我这次能算明白自己扣在哪,靠的是把它的源码读了一遍、再把它的引擎跑起来。可绝大多数站长不会去读一个插件的源码,更没有能力复现它的打分过程——一个站长要证明自己清白,得先成为它的代码审计员,这件事本身就够荒诞了。

做得好的工具是怎么样的#

我不是说个人开发者不该做安全工具。恰恰相反,我是想说,这件事有现成的正确答案可以抄。

主流的安全网址检测,比如 Google Safe Browsing、腾讯网址安全中心、360 网址安全检测,有几个共同点。

第一,措辞克制。 它们会写「此网站可能包含有害程序」,而不会写「该网站是恶意网站」。前者是概率陈述,后者是事实断言。这个差别在工程上很小,在对站长的影响上很大。

第二,有正经的申诉通道。 站长能直接看到自己为什么被拦、要改什么,整改完提交重新审核,通常几小时到几天出结果。这是流程,不靠人情,也不靠用户替站长点按钮。

第三,宁可漏报,不轻易定罪。 安全行业有个常识:误报的代价通常高于漏报。因为误报伤害的是无辜的第三方,而漏报背后还有浏览器沙箱、杀软、用户自己的判断力兜底。

对照下来,一个阈值压得极低、措辞用「恶意」、反馈全靠用户手动点、issue 堆着不处理的工具,缺的恰恰是这三条里的每一条。

再加三条我自己的建议,都是这次踩坑踩出来的:

一,把扣分明细亮出来。 插件现在弹的卡片上只有域名和检测时间,没有说明「你被扣在哪个维度上」。哪怕只是给站长开一个只读的分数页,也能让「此报告有误」这个按钮从盲猜变成有依据的反馈。我这次是靠读源码才知道自己的分扣在哪,这不该是常态。

二,别让同一次判定因为执行路径不同而得出不同结论。 我那张 87 / 107 的对照表就是例子:同一个页面、同一份数据,只是异步重算时少传了一个参数,结论就从「安全」翻成「危险」。分数一旦算出来,后续的修正应该只允许往「更轻」的方向调整,或者至少保证前后两次用的是同一套输入。

三,如果两个弱信号加起来就能越过阈值,那这个阈值就不是「可疑程度」的刻度。 更稳的做法是给不同维度设权重或上限,让「一个 +50 加一个 +57」和「一个 +107 的强信号」不再等价。毕竟这两件事的可疑程度,差得远。

更让我在意的是另一件事#

真正让我不舒服的,不是被判错。自动化检测会出错,这我能理解,任何做技术的人都知道这是常态。

让我不舒服的是这个错误的成本分配。

插件作者在 Firefox 扩展页面上其实写得很清楚:

本扩展仍在持续开发迭代中,当前版本仍可能存在未知 bug 或误报情况。 如遇到以下问题,欢迎通过弹窗底部的一键反馈功能向我们报告: • 正常网站被误判为危险(点击「此报告有误」)

我知道误报难免,我也相信作者不是故意针对谁。但把一个还在「可能误报」阶段的工具,用「疑似钓鱼」「恶意网站」这种定罪式措辞,直接怼到用户屏幕前,再加上页面级拦截、按钮禁用、MutationObserver 这一整套强制手段,这个组合本身就有问题。

这插件装了多少人呢?Firefox 商店上写着 71 个用户。数字不大,但 Edge 和 Chrome 加起来肯定更多。这些都是真实的人,看到「恶意网站」四个字,绝大多数不会去点那个小小的「此报告有误」,他们的选择是关掉页面,然后永远不再来。

而我要做什么呢?我得先自己发现被拦了(这次还是读者告诉我的),然后自己去反馈,等作者处理(issue 区一堆没人管的),处理完了还得等插件更新,等更新分发到用户手里。

整个过程里,我的站一直在被拦。

如果作者能看到这篇,我没有要开撕的意思。你做的事情有价值,方向我认。但我想提一个建议:默认别用「恶意」这种词。你不确定的,就写「未通过安全检测,建议谨慎访问」,把判断权还给用户。现在这个措辞,是把你的不确定,包装成了对我网站的确定指控。

说是「恶意拉黑」可能有点重,毕竟没有证据表明是人为针对。但说实话,一个站长辛苦攒的流量,就这么被一套没验证过的规则顺手掐掉,你让我怎么心平气和地看待它。

所以,访问本站请这样做#

如果你装了「银狐木马检测 - Virus Detector」,看到访问 zakofox.cn 时弹出警告,那是误报,本站没有任何问题。

几个处理办法,按推荐程度排:

最省事的:直接禁用这个插件。 我不建议你为了访问一个博客去折腾白名单。这类插件目前的状态就是误报率偏高,禁用掉、靠自己的判断力上网,比装一个时不时冤枉好人的工具要舒服。浏览器地址栏输 chrome://extensions(Edge 是 edge://extensions,Firefox 是 about:addons),找到它,关掉开关就行。

如果你还想留着它: 在弹出的警告卡片里找「此报告有误」之类的反馈按钮点一下。这能帮作者改进规则,也算是帮后面被误拦的站长一把。不过别指望立刻生效。

如果你懂点技术: 打开 F12,或者干脆换个没装插件的浏览器、无痕窗口访问。本站是纯静态站,源码在 GitHub 上公开着,你可以自己翻,看看里面到底有没有能「钓」到你的东西。

顺便说一句,我这个站连登录功能都没有,评论区用的是 Giscus(走 GitHub 账号,本站不接触你的密码),也没有任何表单让你填账号密码。想被骗都没地方填。

最后#

做站这么久,被搜索引擎降权过,被 CDN 抽风坑过,被各种爬虫薅过流量。但被一个「安全工具」贴上「恶意网站」的标签,这还真是头一回。

而且这次的经历有一种奇怪的错位感:我一直以为,一个站会不会被判定成恶意,取决于它做了什么。结果它取决于我什么时候注册的域名、用的是哪一级后缀。前者是行为,后者是出身。用出身来推断行为,本质上是一种有罪推定。

更荒诞的是解决办法。我什么都改不了——不用改代码,不用删内容,不用加什么安全声明。我只需要等。等到域名注册满 365 天,那 57 分会掉到 4 分;等到满 730 天,才能拿到那 20 分的减分。时间一到,我就自动「洗白」了。

一个靠等待来洗清嫌疑的安全体系,我不太确定它到底在保护谁。

我理解做安全工具的人不容易,尤其是个人开发者,规则稍有偏差就是误伤。但反过来说,正是因为这个位置有权力——你说谁是恶意网站,用户就信谁是恶意网站——所以才更应该谨慎。工具越是有判断权,越要克制自己的判断。

这篇文章发出来之后,我会去那个 issue 区正式反馈一次,把我算出来的分数明细一起贴过去:.cn 无备案本该 30 分、异步核验后变成 50 分;域名年龄 +57 分;87 → 107 越过阈值。这个案例应该比一句「我的站被误拦了」有用得多。处理了我就回来更新;如果一直没动静,这篇就留着当个记录。

毕竟今天是 3DM,是我,明天可能就是你的站。


文中截图均为 2026 年 9 月 27 日的实际界面。分数明细基于 Virus Detector 开源仓库的 background/scoring-engine.js、background/service-worker.js 与 utils/constants.js 实跑得出(对比过 v2.5.2 与 3.0.0-alpha.1,本文涉及项一致)。插件版本更新后情况可能变化。

我的站被一个「安全插件」拉黑了,顺便聊聊 3DM 也躺枪这件事
https://zakofox.cn/posts/virusdetector-wrongly-blocks-my-site/
作者
临明小狐狸
发布于
2026-09-27
许可协议
CC BY-NC-SA 4.0
评论加载中...