开发Web的一个原则就是,不能信任用户输入的任何信息,所以验证和过滤用户的输入信息就变得非常重要。为了编写出安全可靠的Web程序,验证表单输入的意义重大。
1、必填字段
你想要确保从一个表单元素中得到一个值,Go有一个内置函数len可以获取字符串的长度,这样我们就可以通过len来获取数据的长度,例如:
if len(r.Form["username"][0]) == 0 {
// 为空的处理
}
r.Form对不同类型的表单元素的留空有不同的处理:
1)对于空文本框、空文本区域以及文件上传,元素的值为空值;
2)对于未选中的复选框和单选按钮,需要通过r.Form.Get()来获取值,因为如果字段不存在,通过该方式获取的是空值,但是通过r.Form.Get()只能获取单个的值。
2、数字
如果想要确保一个表单输入框中获取的只能是数字,例如,你想通过表单获取某个人的具体年龄是50岁还是10岁,而不是像“一把年纪了”或“年轻着呢”这种描述。
如果我们是判断正整数,那么我们先转化成int类型,然后进行处理:
age, err := strconv.Atoi(r.Form.Get("age"))
if err != nil {
// 数字转换出错了,那么可能不是数字
}
if age > 100 {
// 年龄太大,义务异常逻辑处理
}
正则匹配方式:
import "regexp"
if age, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("age")); !age {
return false
}
Go实现的正则是RE2,所有的字符都是UTF-8编码的。
3、中文
为了保证获取的是正确的中文,我们目前有两种验证方式:可以使用 unicode 包提供的 func Is(rangeTab *RangeTable, r rune)bool 来验证,也可以使用正则方式来验证。
if m, _ := regexp.MatchString("^\\p{Han}+$", r.Form.Get("username")); !m {
return false
}
4、英文
获取一个英文值,通过正则验证数据:
if m, _ := regexp.MatchString("^[a-zA-Z]+$", r.Form.Get("username")); !m {
return false
}
5、电子邮件地址
验证Email地址是否正确:
if m, _ := regexp.MatchString(`^([\w\.\_]{2,10})@(\w{1,}).([a-z]{2,4})$`, r.Form.Get("username")); !m {
return false
}
6、手机号码
if m, _ := regexp.MatchString(`^(1[3|4|5|8][0-9]\d{4,8})$`, r.Form.Get("username")); !m {
return false
}
7、下拉菜单
判断表单里面生成的select下拉菜单中是否有被选中的元素:
fruit := []string{"apple", "pear", "banana"}
v := r.Form.Get("fruit")
for _, item := range fruit {
if item == v {
return true
}
}
return false
8、单选按钮
判断radio按钮是否有一个被选中了:
gender := []string{"1", "2"}
v := r.Form.Get("gender")
for _, item := range gender {
if item == v {
return true
}
}
return false
9、复选框
对于复选框checkbox的验证,因为我们接收到的数据是一个slice:
# go get github.com/astaxie/beeku
import (_ "github.com/astaxie/beeku")
interest := []string{"football", "basketball", "tennis"}
// Slick_diff在库github.com/astaxie/beeku
diff := Slice_diff(r.Form["interest"], interest)if diff == nil {
return true
}
return false
10、身份证号码
// 验证15位身份证,全部是数字
if m, _ := regexp.MatchString(`^(\d{15})$`, r.Form.Get("userid")); !m {
return
}
// 验证18位身份证,最后一位是校验位,可能为数字或字符X
if m, _ := regexp.MatchString(`^(\d{17})([0-9]|X)$`, r.Form.Get("userid")); !m {
return
}