82 lines
1.8 KiB
Go
82 lines
1.8 KiB
Go
package service
|
||
|
||
import (
|
||
"errors"
|
||
"net"
|
||
"regexp"
|
||
"strings"
|
||
)
|
||
|
||
// Validator Yggdrasil验证器
|
||
type Validator struct{}
|
||
|
||
// NewValidator 创建验证器实例
|
||
func NewValidator() *Validator {
|
||
return &Validator{}
|
||
}
|
||
|
||
var (
|
||
// emailRegex 邮箱正则表达式
|
||
emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$`)
|
||
)
|
||
|
||
// ValidateServerID 验证服务器ID格式
|
||
func (v *Validator) ValidateServerID(serverID string) error {
|
||
if serverID == "" {
|
||
return errors.New("服务器ID不能为空")
|
||
}
|
||
if len(serverID) > 100 {
|
||
return errors.New("服务器ID长度超过限制(最大100字符)")
|
||
}
|
||
// 防止注入攻击:检查危险字符
|
||
if strings.ContainsAny(serverID, "<>\"'&") {
|
||
return errors.New("服务器ID包含非法字符")
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// ValidateIP 验证IP地址格式
|
||
func (v *Validator) ValidateIP(ip string) error {
|
||
if ip == "" {
|
||
return nil // IP是可选的
|
||
}
|
||
if net.ParseIP(ip) == nil {
|
||
return errors.New("IP地址格式无效")
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// ValidateEmail 验证邮箱格式
|
||
func (v *Validator) ValidateEmail(email string) error {
|
||
if email == "" {
|
||
return errors.New("邮箱不能为空")
|
||
}
|
||
if !emailRegex.MatchString(email) {
|
||
return errors.New("邮箱格式不正确")
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// ValidateUUID 验证UUID格式(简单验证)
|
||
func (v *Validator) ValidateUUID(uuid string) error {
|
||
if uuid == "" {
|
||
return errors.New("UUID不能为空")
|
||
}
|
||
// UUID格式:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (32个十六进制字符 + 4个连字符)
|
||
if len(uuid) < 32 || len(uuid) > 36 {
|
||
return errors.New("UUID格式无效")
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// ValidateAccessToken 验证访问令牌
|
||
func (v *Validator) ValidateAccessToken(token string) error {
|
||
if token == "" {
|
||
return errors.New("访问令牌不能为空")
|
||
}
|
||
if len(token) < 10 {
|
||
return errors.New("访问令牌格式无效")
|
||
}
|
||
return nil
|
||
}
|