1
0
mirror of https://github.com/zu1k/nali.git synced 2025-01-23 21:59:02 +08:00
nali/internal/tools/ipparser.go

91 lines
2.0 KiB
Go
Raw Normal View History

2020-07-21 17:23:38 +08:00
package tools
2020-07-17 10:52:36 +08:00
import (
"regexp"
"strings"
)
var (
2020-09-07 10:23:35 +08:00
ipv4re *regexp.Regexp
2020-07-18 09:52:59 +08:00
ipv6re0 *regexp.Regexp
ipv6re *regexp.Regexp
2020-07-17 10:52:36 +08:00
)
func init() {
ipv4re = regexp.MustCompile(`(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}`)
2020-07-18 09:52:59 +08:00
ipv6re0 = regexp.MustCompile(`^fe80:(:[0-9a-fA-F]{1,4}){0,4}(%\w+)?|([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4})?::(([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4})?$`)
ipv6re = regexp.MustCompile(`fe80:(:[0-9a-fA-F]{1,4}){0,4}(%\w+)?|([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4})?::(([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4})?`)
2020-07-17 10:52:36 +08:00
}
2020-09-07 10:23:35 +08:00
func ValidIP4(IP string) bool {
arr := strings.Split(IP, ".")
if len(arr) != 4 {
return false
}
for _, elem := range arr {
if elem == "" {
return false
}
if len(elem) > 1 && elem[0] == '0' {
return false
}
num := 0
for _, c := range elem {
if c >= '0' && c <= '9' {
num = num*10 + int(c-'0')
} else {
return false
}
}
if num > 255 {
return false
}
}
return true
2020-07-17 10:52:36 +08:00
}
2020-07-18 09:52:59 +08:00
func ValidIP6(str string) bool {
str = strings.Trim(str, " ")
return ipv6re0.MatchString(str)
2020-09-07 10:23:35 +08:00
//return isIPV6(str)
2020-07-18 09:52:59 +08:00
}
2020-07-17 10:52:36 +08:00
func GetIP4FromString(str string) []string {
str = strings.Trim(str, " ")
return ipv4re.FindAllString(str, -1)
}
2020-07-18 09:52:59 +08:00
func GetIP6FromString(str string) []string {
str = strings.Trim(str, " ")
return ipv6re.FindAllString(str, -1)
}
2020-09-07 10:23:35 +08:00
//IPV6地址的判断
//1. 用“”分割字符串若长度不等于8则return Neither
//2. 遍历每一个数组的每一个元素若元素的长度大于4则return Neither
//3. 判断每一个元素的字符若出现非0-9A-F的字符则return Neither
func isIPV6(IP string) bool {
IP = strings.ToUpper(IP)
arr := strings.Split(IP, ":")
if len(arr) != 8 {
return false
}
for _, elem := range arr {
if elem == "" || len(elem) > 4 {
return false
}
for _, c := range elem {
if (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') {
continue
} else {
return false
}
}
}
return true
}