Web 互操作

时间、URL 与 Web 互操作:测试边界而非表象

Web 值常常看起来可读,却携带隐藏的单位、上下文或兼容性假设。本指南让每个值通过真正消费它的系统进行验证。

逐个组件跟踪 URL 数据

URL 包含方案、授权、路径、查询和片段结构。编码查询值不同于编码路径段或完整 URL。先准备一个包含分隔符、百分号、空格和 Unicode 的值,让它依次通过客户端构建器、浏览器、代理、框架解析器和应用,确保只在预期层编码和解码一次。

不要把解码当作验证。解码后的字符串可能引入分隔符、路径穿越序列或标记字符,还需要独立规范化和策略检查。表单数据常把加号当作空格,而通用 URI 百分号编码不会;应比较两端实现的准确约定。

区分时间瞬间、时区与调度

Unix 时间戳表示相对于 UTC 纪元的瞬间,通常使用秒或毫秒。存储和比较时应明确单位。ISO UTC 适合日志;浏览器本地显示只是展示,取决于时区数据和夏令时规则。故障时间线应同时保留 UTC 和原始源值。

Cron 表达式描述的是特定实现与环境下的调度。五字段 Unix cron、Quartz 和云调度器在字段数量、特殊符号、日期匹配和时区支持上不同。应让生产调度器列出午夜、月末和夏令时切换附近的未来执行,而不是依赖字段解释。

针对准确输出上下文转义 HTML

HTML 文本、带引号属性、无引号属性、URL、JavaScript 和 CSS 属于不同解析上下文。替换 & 和尖括号适合基本文本节点,不是完整跨站脚本防护。应针对实际上下文使用框架输出编码;允许用户提交标记时使用白名单清理器。

实体解码后若再次被当作标记解释,风险会增加。应让不可信内容在每一层都保持为数据,避免重复解码,并测试最终 DOM 而不只是中间字符串。本地编码器适合教学和调试,真正边界必须由应用模板系统实施。

把颜色与 User-Agent 当作提示

Hex、RGB 和 HSL 可以用不同舍入表示同一个不透明 sRGB 风格颜色。数值等价不能证明对比度可读、显示配置一致或广色域匹配。应在支持的浏览器中渲染设计令牌,并测试每组前景、背景、悬停、焦点、禁用和错误状态的对比度。

User-Agent 是兼容性提示,不是可靠身份。它可能被冻结、精简或伪造,并常包含多个产品标记。应优先使用响应式设计和特性检测。服务端分析确需分类时,应保留未知类别、对解析器进行版本管理,且绝不能让结果决定身份验证或授权。

测试完整消费路径

为 URL 分隔符、秒与毫秒时间戳、时区切换、危险 HTML 字符、颜色舍入和未知 User-Agent 保留固定样例。让它们通过生产使用的相同库、代理、模板、调度器和浏览器。浏览器工具可隔离一次转换,互操作性只有在系统边界验证后才能成立。

  • 时间证据记录单位、时区和运行时。
  • 在最终消费上下文中编码和转义。
  • 优先依据能力,而不是浏览器名称启发式判断。