防御性设计:验证
业务场景:
在日常开发中,尤其是在 web 应用开发中,我们经常需要对数据的合法性进行验证。为了实现这一目的,我们通常会对参数进行一些前置验证。这些验证规则可以包括必填项、范围、格式、正则表达式、安全性以及自定义规则等。
通常,为简化业务逻辑,我们会借助一些第三方工具来进行这些通用性的检测。
案例 1:
如果是基于 pb 协议,可以启用 protoc-gen-validate (PGV) 自动化数据校验插件。配置规则如:
强校验 title
字段长度在 1 ~ 100 个字符:
1 | string title = 1 [(validate.rules).string = {min_len: 1, max_len: 100 }]; |
一般地,保存数据库之前,为防止溢出,可对其长度做前置检查。
案例 2:
对于非 pb 定义的结构,也有一些类似的组件实现自动化校验。如 Go Struct and Field validation ,基本用法如下:
1 | // User contains user information |
如果预置的
valadator
不满足需求,也可以自定义validator
。
谚云:防御不到位,上线跑断腿
防御性设计是考虑使用者可能会错误使用的情况,从设计上避免错误使用,或是降低错误使用的机会。防御性设计可以让软件更安全、可靠,更方便地找到使用者的错误。