知识卡片
类型系统把校验逻辑收进构造函数
内容
判断一段处理URL或拼接SQL的代码是否安全,原本需追溯所有调用来源、确认上游都做了正确校验,工作量随系统规模增长会超出人力审查极限。把”已校验的URL”或”可安全拼进SQL的字符串”设计成独立类型(如Url、SafeSql),只在构造函数里做一次校验,之后该类型值都天然满足约定,下游代码不用关心值从哪来。这把安全不变量的证明责任从”审查所有调用点”收缩成”审查一个构造函数”,前提是代码库不存在绕过类型系统的恶意代码。
参考来源
- 位置:《Google系统架构解密:构建安全可靠的系统》第6章《面向易理解性的设计》6.4.2节(源文件:`../OREILY动物书合辑 图灵新版/_epub-src/text/part0014_split_059.html`)
- 结论依据:原文对比"URL用普通字符串传递需理解所有上游代码"与"用Url.parse()构造出的标准化类型只需检查该类型实现和用法"两种设计,并指出类型封装的前提是"周围的代码是由非恶意的开发人员所编写的,并且代码在没有受到侵害的环境中执行"。
- 原始内容:通过将URL设定为一种类型,只需要了解Url.parse()(以及类似的构造函数、工厂函数)内数据验证的实现方式以及URL的最终用法即可……前提是周围的代码是由非恶意的开发人员所编写的,并且代码在没有受到侵害的环境中执行。