把它做成生产功能之前,需要先拆开协议事实、产品承诺和运行成本,三者混在一起很容易得到错误结论。 剪贴板 HTML 可包含事件属性、危险 URL、SVG 与浏览器特有标记。即使来源是用户自己的应用,跨设备传输后进入 DOM 仍是新的信任边界。
安全评审要从资产、攻击者能力和信任边界出发,并在每次状态转换重新授权。输入校验、速率限制和审计只能互补,任何一个都不能替代权限判断。
落地方案的关键部件
这项能力横跨客户端、网络与服务端,局部最优很容易制造全局故障。工程决策需要同时约束两端行为、持久化事实和运维预算。
- 默认传输与渲染纯文本;确需格式时使用成熟 allowlist 清洗器,移除脚本化 URL、样式泄漏和未知命名空间,并通过 Trusted Types 写入。
- 所有输入都设置大小、次数和时间预算,并在超限时返回可操作的稳定错误码。
- 上线参数必须有保守默认值、服务端上限和灰度开关,不能把浏览器传来的数字直接当作资源预算。
“剪贴板与富文本 XSS:复制进来的 HTML 也属于不可信输入”的交付标准是正常路径可用、异常路径收敛、资源有界,并且用户能理解系统为何采用当前状态。 这样得到的不是演示代码,而是能解释、能降级、能回滚的生产能力。
别让错误假设进入生产
生产问题往往发生在两个正确动作同时到达时。需要逐条检查迟到消息、重复执行、资源耗尽和版本交叉,而不是只补当前堆栈显示的那一行。
- 正则删除 script 标签挡不住 img onerror、SVG animate 或 javascript URL;只在发送端清洗又信任了可被篡改的客户端。
- 刷新或网络切换同时触发两条恢复路径,重复副作用被误当成两次真实用户操作。
- 没有背压或配额时,慢消费者会把内存、队列长度与尾延迟一起推高,最后拖累无关用户。
发布闸门应该检查什么
用已知输入和可控故障建立金样本,然后把线上低基数指标与测试结果对齐。只有指标能提前识别同类退化,验证才真正延伸到生产。
- 使用常见 XSS polyglot、嵌套 SVG、畸形 HTML、超大富文本和纯文本回退跨浏览器传输,验证 DOM 无可执行节点。
- 用乱序、重复和延迟消息驱动状态机,确认旧版本被丢弃且显式停止不会被自动恢复覆盖。
- 用故障注入验证告警先于用户投诉触发,并确认值班人员能从有限证据定位到具体阶段。
可以上线的标准是:用户知道当前发生了什么,系统在异常后能停止或恢复,资源不会无界增长,运维也能从最小必要证据定位阶段。