跨 Realm 的浏览器 API 完整性
理解浏览器 API 由哪个 Realm 所有,以及为什么反射只能用于有限的兼容性观察,而不是身份信号。
BotBrowser Team
BotBrowser 可以在声明的受控上下文中重复授权的 Window、Worker 和 iframe API 流程,并比较可见结果。它不能让各 Realm 的 API 完全一致、授予跨源访问或证明生产隐私;应用仍负责所有权、源策略、可访问性和数据最小化。
API 所有权属于各自 Realm
WHATWG 将 Realm 描述为拥有独立全局对象和内置对象的执行环境。顶层 Window、专用 Worker 和 iframe 文档因此拥有不同的 API 对象。Array 或 fetch 等值必须按暴露它的 Realm 理解,而不是当成统一的浏览器对象。
MDN 的 JavaScript 执行模型也区分执行上下文、任务和 agent。Worker 没有文档 DOM,iframe 则有自己的文档和策略上下文。因此,一个 Realm 支持的操作可能在另一个 Realm 中不可用或受策略限制。可执行的产品合同应写明所有者、所需能力和回退。
消息保留明确边界
Window 与 iframe 可以使用 postMessage,Worker 也能和拥有它的页面交换消息。结构化克隆会创建接收方拥有的值,不会保留发送方对象身份。ArrayBuffer 等可转移对象会移动所有权,发送方不能继续使用原资源。
每条消息都应定义版本、操作、有限载荷和预期响应。使用数据前校验 event.origin 和 schema。源校验只能识别 Web 源,不是业务授权。iframe 导航后,接受响应前要重新检查源和协议。
反射的含义是有限的
反射可以回答某个 API 属性是否在当前 Realm 暴露,或值是否具有可调用形状。它不能证明实现完整、其他 Realm 行为相同,也不能证明浏览器、设备或个人身份。构造函数、属性名和异常文本可能随版本和策略变化。
只为应用需要的操作使用反射,再用合成输入执行支持路径。属性存在不等于权限、用户激活、网络、渲染或可访问性一定成功。记录声明的浏览器上下文和可见结果,不要收集全局对象的不必要清单。
可访问且保护隐私的回退
Worker 或 iframe 能力不可用时,应展示可读状态、保持键盘焦点,并提供安全的本地或服务端渲染替代。超时或拒绝消息应有可见恢复动作和有限重试。可访问性属于应用合同,不是浏览器分类手段。
跨 Realm 只发送操作所需的最小记录。不要复制页面状态、账户记录、令牌或诊断清单。审查后删除合成诊断并记录保留期限。Realm 标签或反射结果不能变成隐藏分析维度或持久标识符。
API 完整性检查清单
- 写明所有者 Realm:Window、Worker 或 iframe 文档。
- 说明所需 API 操作及支持的回退。
- 定义带版本的消息 schema、源校验、超时和清理责任人。
- 将克隆值视为接收方所有,将转移资源视为所有权已移动。
- 使用合成数据测试可见恢复、键盘访问和最小保留。
- 记录声明上下文和结果,不推断身份或普遍一致性。
BotBrowser 能力与限制
BotBrowser 受控上下文可以使用声明的 profile 重复此授权 API 流程,并比较隔离上下文中的可见结果。它不能让 Window、Worker 和 iframe API 完全相同,不能授予跨源访问、认证消息,也不能把反射变成隐私、匿名、设备身份或生产安全的证明。
公开来源
相关文章:跨 Realm 浏览器一致性和跨表面浏览器隐私。
- WHATWG HTML:Realms
- WHATWG HTML:Web messaging
- MDN:JavaScript execution model
- BotBrowser advanced features