【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

相关推荐
Small-K11 分钟前
前端框架中@路径别名原理和配置
前端·webpack·typescript·前端框架·vite
bin915315 分钟前
【EXCEL数据处理】000009 案列 EXCEL单元格数字格式。文本型数字格式和常规型数字格式的区别
大数据·前端·数据库·信息可视化·数据分析·excel·数据可视化
山语山34 分钟前
C语言——文件读写操作
java·c语言·前端·microsoft·visual studio
太阳火神的美丽人生1 小时前
Vant WeApp 开启 NPM 遇到的问题总结
前端·npm·node.js
哈哈哈哈cwl1 小时前
一篇打通浏览器储存
前端·面试·浏览器
凌云行者2 小时前
使用rust写一个Web服务器——async-std版本
服务器·前端·rust
等什么君!2 小时前
JavaScript数据类型
开发语言·前端·javascript
DK七七2 小时前
【PHP陪玩系统源码】游戏陪玩系统app,陪玩小程序优势
前端·vue.js·游戏·小程序·php·uniapp
yqcoder2 小时前
css 选择除第一个子元素之外的所有子元素
前端·css
blaizeer3 小时前
深入浅出 CSS 定位:全面解析与实战指南
前端·css