【Go】HTTP编程4-请求校验 validator

常见的网站攻击

1 XSS (Cross-Site Scripting ) 跨站脚本攻击

为什么不叫css ,为了和 前段的css 区分

通过注入脚本获取敏感信息

2 CSRF ( Cross-site request forgery )跨站请求伪造

3 jsonp

https://blog.bitsrc.io/top-7-frontend-security-attacks-2e2b56dc2bcc

validator

简介

包validator根据标签 实现结构和各个字段的值验证。

它具有以下独特功能:

  • 通过使用验证标签或自定义验证器进行跨字段(Cross Field)和跨结构体(Cross Struct)验证。
  • 切片slice、数组array和map,允许验证多维字段的任意或所有级别。

安装

使用 go get

go get github.com/go-playground/validator/v10

然后包导入到您自己的代码中。

import "github.com/go-playground/validator/v10"

TODO 看下高版本的GO go install 和 go get的区别

范围约束

对于字符串,切片,数组和map ,约束其长度。len=10,min=6,max=10,gt=10

对于数值,约束其取值。min,max,eq,ne,gt,gte,lt,lte,oneof=6 8

min 最小值

max 最大值

eq 等于

ne 不等于 not

gt 大于 grant than

get 大于等于 grant equle than

lt 小于等于 less than

lte less

oneof = 6 8

跨字段约束

跨字段就在范围约束的基础上加field 后缀

如果还跨结构体(cross struct) 就在跨字段的基础上再field前面加cs

范围约束 cs field

字符串约束

contains 包含子串

containsany 包含任意Unicode字符,containsany=abcd

containsrune 包含rune字符,containsrune=😊

excludes 不包含子串

excludesall 不包含任意Unicode字符,excludesall=abcd

excludesallrune 不包含rune字符,excludesallrune=😊

startwith 以子串为前缀

endswith 以子串为后缀

唯一性uniq约束

对于数组和切片,约束没有重复的元素

对于map ,约束没有重复的value

对于元素类型为结构体的切片,unique约束结构体对象的某个字段不重复,通过unqiue=field指向这个字段名

Go 复制代码
Friends []User `validate:"unique=Name"`

自定义约束

Go 复制代码
// 定义一个校验电子邮箱格式的vaildator

// 注册一个自定义的validator

举例

Go 复制代码
package main

import (
	"fmt"
	"github.com/go-playground/validator/v10"
)

// 用户信息结构体
type User struct {
	UserName string `validate:"gte=3"` // 用户名长度 大于3  gt grant than
	PassWord string `validate:"min=6,max=12"` // 密码 长度 最少 6为 最大12为
	PassRepeat string `validate:"eqfield=PassWord"` // 和字段PassWord 相同
	Email string `validate:"required,email"` // 满足字符串格式
	Age uint8 `validate:"gte=0,lte=120"`// 年龄 大于等于0 小于等于120
	Gender string `validate:"oneof=male female prefer_not_to"` // 枚举
	FavouriteColor string `validate:"iscolor"`
	Addresses []*Address `validate:"required,dive,required"`
}

// 地址结构体
type Address struct {
	Street string `validate:"required"`
	City string `validate:"required"`
	Planet string `validate:"required"`
	Phone string `validate:"required"`
}

var  validate *validator.Validate

func main()  {
	validate = validator.New(validator.WithRequiredStructEnabled())
	validaterStruct()
	validateVariable()
}

func validaterStruct(){
	address := &Address{
		Street: "唐塔街道",
		Planet: "Perphone",
		Phone: "none",
	}

	user := &User{
		UserName: "yhh",
		PassWord: "12345",
		PassRepeat: "1234567",
		Email: "yhh@qq.com",
		Age: 136,
		Gender: "male",
		FavouriteColor:"#000-",
		Addresses: []*Address{address},
	}
    // 校验结构的字段是否符合规则
	err := validate.Struct(user)
	if err != nil {
		fmt.Println(err)
	}
}

func validateVariable()  {
	myEmail := "yanhaihang.163.com"
	err := validate.Var(myEmail,"required,email")
	if err!=nil {
		fmt.Println(err)
	}
}

资料

github

https://github.com/go-playground/validator

相关推荐
轻口味1 小时前
命名空间与模块化概述
开发语言·前端·javascript
前端小小王2 小时前
React Hooks
前端·javascript·react.js
迷途小码农零零发2 小时前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
娃哈哈哈哈呀2 小时前
vue中的css深度选择器v-deep 配合!important
前端·css·vue.js
旭东怪3 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
ekskef_sef4 小时前
32岁前端干了8年,是继续做前端开发,还是转其它工作
前端
sunshine6415 小时前
【CSS】实现tag选中对钩样式
前端·css·css3
真滴book理喻5 小时前
Vue(四)
前端·javascript·vue.js
蜜獾云5 小时前
npm淘宝镜像
前端·npm·node.js