【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

相关推荐
李昊哲小课5 分钟前
HTML 完整教程与实践
前端·html
GISer_Jing25 分钟前
React 18的createRoot与render全面对比
前端·react.js·前端框架
我叫汪枫27 分钟前
React Hooks原理深度解析与高级应用模式
前端·react.js·前端框架
我叫汪枫27 分钟前
深入探索React渲染原理与性能优化策略
前端·react.js·性能优化
阿智@1139 分钟前
推荐使用 pnpm 而不是 npm
前端·arcgis·npm
伍哥的传说1 小时前
QRCode React 完全指南:现代化二维码生成解决方案
前端·javascript·react.js·qrcode.react·react二维码生成·qrcodesvg·qrcodecanvas
IT_陈寒1 小时前
Vite 5.0 终极优化指南:7个配置技巧让你的构建速度提升200%
前端·人工智能·后端
listhi5201 小时前
Map对象在JavaScript循环中的使用
开发语言·前端·javascript
安卓开发者1 小时前
鸿蒙Next Web组件生命周期详解:从加载到销毁的全流程掌控
前端
我叫汪枫4 小时前
前端物理引擎库推荐 - 让你的网页动起来!
前端