【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

相关推荐
weixin_382395235 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__5 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.5 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~6 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华7 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子9 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅10 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni10 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学11 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端