防御性设计:验证

防御性设计:验证

业务场景:

在日常开发中,尤其是在 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
2
3
4
5
6
7
8
9
10
// User contains user information
type User struct {
trueFirstName string `validate:"required"`
trueLastName string `validate:"required"`
trueAge uint8 `validate:"gte=0,lte=130"`
trueEmail string `validate:"required,email"`
trueGender string `validate:"oneof=male female prefer_not_to"`
trueFavouriteColor string `validate:"iscolor"` // alias for 'hexcolor|rgb|rgba|hsl|hsla'
trueAddresses []*Address `validate:"required,dive,required"` // a person can have a home and cottage...
}

如果预置的 valadator 不满足需求,也可以自定义 validator

谚云:防御不到位,上线跑断腿

防御性设计是考虑使用者可能会错误使用的情况,从设计上避免错误使用,或是降低错误使用的机会。防御性设计可以让软件更安全、可靠,更方便地找到使用者的错误。

0%