Go Web3. 验证表单输入

开发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

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容