常见的网站攻击
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