摘要

  • AIRRS 的公开 JavaScript 在请求 RIPEstat 页面结构时追加了字面参数 amp;profile=afrinic。它位于 JavaScript 字符串内,不会像 HTML 文本那样把 & 解码成另一个写法;实际参数名就是 amp;profile。
  • 2026 年 9 月 11 日,ASN、前缀、域名和国家四类输入中,默认请求与 AIRRS 字面参数请求都返回 200、七个标签,并且各自的标准化数据哈希完全相同。
  • 同四类输入使用正确名称 profile=afrinic 时全部返回 HTTP 500、status: error、空数据和零标签。这不证明底层组件数据错误,只证明页面显示不能替代配置选择证据。
  • 修复要同时覆盖三件事:客户端发对名称、命名配置能正常响应、页面公开一份选择回执,说明请求配置、实际配置、结构哈希、API 版本、状态和回退规则。

七个标签制造的确定感

软件最会利用人的视觉直觉。输入一个 ASN,页面出现图表;输入一个国家,页面铺开若干标签。只要结果不空,使用者便倾向于认为整条调用链已经理解了请求。明显的报错反而容易处理,因为它迫使人停下来。真正耐久的问题往往长得像成功。

AIRRS 全称 African Internet Registry and Routing Statistics。它把自己描述为 AFRINIC 与 RIPE NCC 的合作项目,通过 RIPEstat 以更易用的方式展示数据。公开说明给它设定的目标并不低:为非洲互联网社群提供有关互联网资源或国家的最新信息,让监管者、网络运营商、政策制定者和研究者据此作出更有依据的判断。

AFRINIC 的发布公告列出了 WHOIS、RIPE RIS、RIPE Atlas 以及若干外部数据集,并明确说 AIRRS 由 RIPE Stat API 驱动。首页向读者展示四类入口:ASN 信息、前缀信息、域名查询和国家报告。

因此,AIRRS 不是所有数据的原产地。它是一层编排界面。用户给出资源后,AIRRS 先向 RIPEstat 请求 results-page-structure,得到应该出现哪些标签和组件,再逐一预载这些组件。这里有两件不同的事:页面结构被成功返回;某个名为 AFRINIC 的配置被成功选择。前者可以在后者没有发生时照常完成。

HTML 写法进入了 JavaScript 字符串

当前公开脚本自称“AFRINIC RIPEstat Template”,文件头写着 2020 年 2 月。捕获到的响应头把最后修改时间标为 2020 年 3 月 11 日 10:00:24 UTC。代码先把用户输入拼到 RIPEstat 的页面结构接口,随后追加:

&profile=afrinic

如果这段字符位于 HTML 正文,& 是展示 & 的实体写法。但它现在位于 JavaScript 字符串中,字符串会直接成为 URL。开头已经是一个真实的 &,后面的 amp;profile 会整体成为查询参数名,值才是 afrinic。浏览器不会再安排一个 HTML 解析步骤,把它还原成名为 profile 的参数。

这种差别非常适合逃过页面冒烟测试。许多 API 会忽略不认识的参数,然后返回默认结果。客户端仍然拿到合法 JSON,仍然能创建标签、加载组件。使用者看到完整页面,却无从知道服务器到底识别了哪个选择器。

要验证配置,不能只看页面是否能画出来,而要比较请求。测试采用 AIRRS 自己宣传的四类资源:ASN AS327800、前缀 196.192.48.0/20、域名 afrinic.net 和国家代码 ZA。每类资源各保留三次响应:不带配置的默认请求、带 AIRRS 原样参数 amp;profile=afrinic 的请求,以及带正确参数 profile=afrinic 的请求。

四类资源给出同一个分叉

对 AS327800,默认请求返回 HTTP 200、status: ok 和七个标签。字面 amp;profile 请求也返回 200、正常状态和七个标签。剔除请求编号、时间等波动字段后,两份 .data 的 SHA-256 哈希完全相同。正确的 profile=afrinic 请求则返回 HTTP 500、status: error、status_code: 500、空数据对象和零标签。

196.192.48.0/20 重复了这套结果:默认成功,AIRRS 字面写法成功且标准化结构与默认相同,正确参数失败。

afrinic.net 没有改变分叉,ZA 也没有。矩阵合计是:四个默认 200;四个字面参数 200,而且每个都与相应默认响应拥有相同的标准化数据哈希;四个正确参数 500。

十二份响应都报告 RIPEstat 构建版本 v0.11.15-2026.09.09、流水线 1415073。证据还保存了各自的请求编号、时间戳、完整响应哈希、标准化数据哈希和标签数。这是一组有边界、可复查的 2026 年 9 月 11 日现场观测,不是对页面印象的转述。

失败响应里有一个容易被误读的字段:data_call_status: supported。RIPEstat 文档把它与 status、status_code 分别定义。“supported”说明这一类数据调用受支持,不会把一次具体执行的 HTTP 500 和 status: error 改写成成功。状态必须合在一起阅读。

这组结果只支持有限结论:对这四个样本,AIRRS 发出的字面参数没有改变默认页面结构;直接选择正确命名的 AFRINIC 配置失败。它没有告诉我们服务器为何返回 500,也没有证明这种状态从 2020 年持续至今,更不能证明所有可能的资源和所有时间点都相同。

默认页面可以有用,仍然不能冒充选择证明

不能把七个标签简单称为错误内容。默认结构可能包含很有价值的路由、注册和测量组件。页面结构确定后,组件还会分别访问 WHOIS、RIPE RIS、RIPE Atlas 等来源。本次测试没有核验某一条路由、某一个注册对象或某一个测量结果的真假,也没有观察到全站中断。

缺失的是页面编排的来源证明。用户不知道 RIPEstat 宣称选中了 afrinic,还是使用了 default;不知道系统是否在配置失败后回退;也看不到结构版本或哈希。AIRRS 的品牌和页面语境替这段空白提供了一个很自然、却未被技术事实确认的答案:既然在 AFRINIC 的界面里,那就应当是 AFRINIC 配置。

有几种可能性都不能由现有证据排除。默认配置和 AFRINIC 配置也许有意相同;二者也许选择不同组件或排序;服务也许还能返回缓存的旧结构。无论哪一种,界面都应该声明实际状态。区域配置并不天然比默认配置更“正确”,它只是一个编排合同。要求选择证据,不是在赋予某个配置额外权威,而是在确认系统做了它声称会做的选择。

对 AIRRS 点名的用户群,这不是纯粹的代码洁癖。研究者可能把截图放入方法说明,监管者可能比较国家页面,运营商可能引用 ASN 图表,政策人员可能把页面视为面向非洲语境的整理结果。如果配置来源没有随内容一起保存,日后再看这些材料时,便无法判断当时采用了区域配置、默认配置还是不透明的回退。

2020 的客户端和 2026 的服务端之间

客户端文件最后修改于 2020 年,测试响应来自 2026 年 9 月的 RIPEstat 构建。这六年时间差足以说明跨服务兼容性值得持续测试,却不足以重建事故史。

证据没有说明 profile=afrinic 在 2020 年是否有效,没有说明参数字符串是否从 HTML 模板复制而来,也没有说明服务器是否改过配置名或结构机制。它还没有提供哪一方曾承诺什么兼容性。Last-Modified 只是捕获文件的时间边界,不是完整部署日志。

因此,不应把观察变成归责故事。AFRINIC 控制 AIRRS 客户端发出什么请求,也能决定如何向用户解释回退。RIPE NCC 控制 RIPEstat 如何解析命名配置以及返回怎样的状态。完整修复很可能需要同时检查两端,但当前来源不支持把 500 的根因指向任何组织、库或个人。

真正可操作的单位是两套系统的接缝。一项长期可用的公开服务,需要一只能跨越这个接缝的金丝雀测试。“首页能打开”不是这只金丝雀。“四类代表性资源在明确点名 AFRINIC 配置时,返回预期结构并声明实际选择”才是。

给页面结构补一张选择回执

消除歧义不需要重做整个门户。AIRRS 可以在结果页或公开诊断入口附上一份精简的配置选择回执。

回执首先记录资源类型和规范化后的资源值,再原样记录发出的参数名、请求的配置值,以及 RIPEstat 声明实际选中的配置。如果系统使用默认值,就明确写 default;不能让字段缺失自动继承页面上的 AFRINIC 品牌。

随后记录页面结构版本或标准化哈希、按顺序排列的标签与组件标识、RIPEstat 构建号、请求编号、时间戳、status、status_code 和 data_call_status。这些信息足以判断配置选择,无须公开访问者的查询历史、地址或敏感运维细节。

回执还要说明回退政策。命名配置不可用时,AIRRS 可以停止并解释错误;可以明确标注“当前使用默认结构”;也可以提供最后一份已知可用的区域结构并标明年龄。三种选择分别偏向来源严谨、持续可用和服务连续性。问题不在于必须选哪一种,而在于不能让用户不知道系统已经换了状态。

最后,把 ASN、前缀、域名和国家四类金丝雀的最近结果纳入回执。HTTP 200 不足以证明结构未变,标签顺序和结构哈希也要比较。客户端改对参数名,只证明它问对了问题;命名配置返回 200,只证明服务端能回答;结构哈希符合预期,才证明回答内容仍满足合同。这三步不能互相替代。

选择回执是本文提出的控制措施,并非 AFRINIC 或 RIPE NCC 已宣布的要求。它的意义不在放大一个拼写细节,而在给一个面向专业判断的门户补上最基本的证据关联:这次查询到底由哪套页面结构组织。

来源