【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

相关推荐
风尚云网14 分钟前
风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计
前端·css·学习·html·html5·风尚云网
木子020416 分钟前
前端VUE项目启动方式
前端·javascript·vue.js
GISer_Jing18 分钟前
React核心功能详解(一)
前端·react.js·前端框架
捂月21 分钟前
Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
前端·spring boot·后端
深度混淆29 分钟前
实用功能,觊觎(Edge)浏览器的内置截(长)图功能
前端·edge
Smartdaili China30 分钟前
如何在 Microsoft Edge 中设置代理: 快速而简单的方法
前端·爬虫·安全·microsoft·edge·社交·动态住宅代理
秦老师Q30 分钟前
「Chromeg谷歌浏览器/Edge浏览器」篡改猴Tempermongkey插件的安装与使用
前端·chrome·edge
滴水可藏海32 分钟前
Chrome离线安装包下载
前端·chrome
m512742 分钟前
LinuxC语言
java·服务器·前端
Myli_ing2 小时前
HTML的自动定义倒计时,这个配色存一下
前端·javascript·html