摘要

  • 在 Ph 里,已经存储、可以看见、可以搜索和默认返回,并不是同一种状态。
  • Turn、LocalPub、ForcePub 与 Sacred 分别让记录内容、网络位置、字段规则和控制路径参与可见性判定。
  • “响应里没有”只能说明某个会话经过某套规则后没有得到它,不能证明底层数据不存在。

1998 年的一名用户,可以在自家电话号码前加上一个星号。电话号码并没有删除,也没有因此加密;记录本人和拥有特权的运维者仍能看见它。变化只发生在普通查询者所看到的目录里。

这个细节来自 1998 年 9 月发布的 RFC 2378。它正式描述了伊利诺伊大学 CCSO Nameserver 的 Ph 协议。Ph 像一部联网的机构电话簿:数据库保存人员或其他对象的条目,每个条目由若干命名字段组成,客户端通过简洁的命令查询。但它真正值得记住的,不是电话簿,而是字段描述符。

每个字段不仅有名称和最大长度,还带着一组可组合的行为词。Public 决定谁能查看。Lookup 决定字段能否作为筛选条件。Indexed 把字段纳入索引,而且每次查询至少要使用一个索引字段。Default 决定客户端未指定返回清单时出现什么;Always 则可以强制返回。Change 允许记录本人修改。Unique 防止修改后与另一条记录的同名字段撞值。NoMeta 禁止通配查询。Encrypt 对传输提出另一层要求。

这些词不是从“公开”到“秘密”的一条刻度。它们回答的是不同问题。一个字段可以公开却不能用于搜索,可以搜索却不默认返回,可以由本人查看却不能由本人修改。把它们压成一个布尔值,就会丢掉原协议最重要的边界。

星号不是脏数据

Turn 允许用户通过在字段文本前加 *,对本人和 Heros 之外的所有人关闭可见性。Heros 是 Ph 对特权管理员的称呼。RFC 的 home_phone 示例同时带有 Lookup Public Change Turn:它本来可搜索、公开、可由本人修改,但本人还能让它退出普通人的视野。

因此,迁移程序若把前导星号当作格式噪声清掉,并不是在“规范化号码”,而是在撤销隐私选择。反过来,普通查询没有返回该字段,也不等于数据库没有保存它。字段仍在,特权视图仍能得到它。

ForcePub 呈现了相反方向的规则。它让字段不受条目整体 suppress 状态影响,继续可见并可检索。字段级规则可以覆盖记录级抑制。可见性由多个来源共同决议,而不是单一名单。

这正是证据层必须分开的原因。存储事实、公开事实、会话可见事实和最终返回结果,是四张不同收据。

外部观察者连字段名都不知道

LocalPub 把一个字段开放给“本地”域名或地址空间内的任何人,却让它在外部完全消失。外部客户端不仅看不到值,fields 命令也不告诉它该字段存在;它不能把这个字段写进查询条件,也不能请求返回。

于是,内外两个客户端在查询某个人之前,看到的模式就已经不同。对外部观察者而言,不是某一格被涂黑,而是整一列从语言里消失了。

Ph 还提供 external 会话选项,让 LocalPub 字段不可见。但 RFC 没有为“本地”建立一个全球统一、经过密码学验证的定义。服务器的运行环境作出分类,协议执行其后果。来源地址、主机名、组织成员身份与访问权可以有关,却绝不是同一事实。

这一区别尤其关键,因为 Ph 被称为“本地”还包含另一层意思:服务器不会自动把客户端转介到可能持有答案的另一台服务器。它可以列出其他 nameserver,供客户端自行查询。一个本地目录里的空结果,更不能被升级为全局不存在。

“神圣”字段也不是永远不可改

Sacred 禁止从网络调用修改字段,却允许通过服务器本地的终端、文件或管道修改。同一字段在网络控制面上只读,在本地控制面上仍可变。严谨的说法不是“无法修改”,而是“不能沿这条路径修改”。

Heros 的权限也并非只有全能一种。完整 Hero 可以查看和修改所有条目;通过 ACL,特权还可以被缩小到另一条记录里的单个字段。审计若只记“管理员操作”,就无法区分有限委托与全局权力。

安全章节继续保持这种克制。Ph 列出了从明文口令、较弱的邮件登录,到 Kerberos 与 GSS-API 的多种认证方式。RFC 明说:没有相互认证,就无法证明服务器身份,也没有机制证明某台服务器对某组信息具有权威性。没有额外的传输保护,流量还可能被观察或篡改。

用户认证、服务器认证、信道保护、字段授权和数据权威性分别回答不同问题。拿到其中一张收据,不能冒充拿到其余几张。

“全部返回”只是全部可见

return all 返回的是当前会话可以看到的所有字段,而不是数据库里的所有字段。fields 命令展示的也只是当前观察者可见的模式。索引状态不会自动带来公开权,公开也不会自动带来修改权。

要解释一次响应,至少应保留:底层记录、字段描述符、抑制标记、本地/外部判定、会话身份、认证方式、Hero 与 ACL 范围、查询条件、返回字段、服务器端点、传输状态和观察时间。

RFC 2378 并不完美。它承认弱认证仍然存在,协议本身也不协商客户端与服务器之间的加密。但它清楚承认了一件经常被现代接口隐藏的事:用户看到的目录是一种经过规则塑形的投影。空白是关于观察路径的事实,不是关于世界的终局判断。