mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2026-01-06 15:55:48 +08:00
实现基础的DDoS防护
This commit is contained in:
@@ -5,9 +5,12 @@ import (
|
||||
"github.com/cespare/xxhash"
|
||||
"math"
|
||||
"net"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var ipv4Reg = regexp.MustCompile(`\d+\.`)
|
||||
|
||||
// IP2Long 将IP转换为整型
|
||||
// 注意IPv6没有顺序
|
||||
func IP2Long(ip string) uint64 {
|
||||
@@ -54,3 +57,24 @@ func IsLocalIP(ipString string) bool {
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// IsIPv4 是否为IPv4
|
||||
func IsIPv4(ip string) bool {
|
||||
var data = net.ParseIP(ip)
|
||||
if data == nil {
|
||||
return false
|
||||
}
|
||||
if strings.Contains(ip, ":") {
|
||||
return false
|
||||
}
|
||||
return data.To4() != nil
|
||||
}
|
||||
|
||||
// IsIPv6 是否为IPv6
|
||||
func IsIPv6(ip string) bool {
|
||||
var data = net.ParseIP(ip)
|
||||
if data == nil {
|
||||
return false
|
||||
}
|
||||
return !IsIPv4(ip)
|
||||
}
|
||||
|
||||
@@ -26,3 +26,26 @@ func TestIsLocalIP(t *testing.T) {
|
||||
a.IsFalse(IsLocalIP("::1:2:3"))
|
||||
a.IsFalse(IsLocalIP("8.8.8.8"))
|
||||
}
|
||||
|
||||
func TestIsIPv4(t *testing.T) {
|
||||
var a = assert.NewAssertion(t)
|
||||
a.IsTrue(IsIPv4("192.168.1.1"))
|
||||
a.IsTrue(IsIPv4("0.0.0.0"))
|
||||
a.IsFalse(IsIPv4("192.168.1.256"))
|
||||
a.IsFalse(IsIPv4("192.168.1"))
|
||||
a.IsFalse(IsIPv4("::1"))
|
||||
a.IsFalse(IsIPv4("2001:0db8:85a3:0000:0000:8a2e:0370:7334"))
|
||||
a.IsFalse(IsIPv4("::ffff:192.168.0.1"))
|
||||
}
|
||||
|
||||
func TestIsIPv6(t *testing.T) {
|
||||
var a = assert.NewAssertion(t)
|
||||
a.IsFalse(IsIPv6("192.168.1.1"))
|
||||
a.IsFloat32(IsIPv6("0.0.0.0"))
|
||||
a.IsFalse(IsIPv6("192.168.1.256"))
|
||||
a.IsFalse(IsIPv6("192.168.1"))
|
||||
a.IsTrue(IsIPv6("::1"))
|
||||
a.IsTrue(IsIPv6("2001:0db8:85a3:0000:0000:8a2e:0370:7334"))
|
||||
a.IsTrue(IsIPv4("::ffff:192.168.0.1"))
|
||||
a.IsTrue(IsIPv6("::ffff:192.168.0.1"))
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"strings"
|
||||
"unsafe"
|
||||
)
|
||||
@@ -36,6 +37,22 @@ func FormatAddressList(addrList []string) []string {
|
||||
return result
|
||||
}
|
||||
|
||||
// ToValidUTF8string 去除字符串中的非UTF-8字符
|
||||
func ToValidUTF8string(v string) string {
|
||||
return strings.ToValidUTF8(v, "")
|
||||
}
|
||||
|
||||
// ContainsSameStrings 检查两个字符串slice内容是否一致
|
||||
func ContainsSameStrings(s1 []string, s2 []string) bool {
|
||||
if len(s1) != len(s2) {
|
||||
return false
|
||||
}
|
||||
sort.Strings(s1)
|
||||
sort.Strings(s2)
|
||||
for index, v1 := range s1 {
|
||||
if v1 != s2[index] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -1,56 +1,67 @@
|
||||
package utils
|
||||
package utils_test
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeNode/internal/utils"
|
||||
"github.com/iwind/TeaGo/assert"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestBytesToString(t *testing.T) {
|
||||
t.Log(UnsafeBytesToString([]byte("Hello,World")))
|
||||
t.Log(utils.UnsafeBytesToString([]byte("Hello,World")))
|
||||
}
|
||||
|
||||
func TestStringToBytes(t *testing.T) {
|
||||
t.Log(string(UnsafeStringToBytes("Hello,World")))
|
||||
t.Log(string(utils.UnsafeStringToBytes("Hello,World")))
|
||||
}
|
||||
|
||||
func BenchmarkBytesToString(b *testing.B) {
|
||||
data := []byte("Hello,World")
|
||||
var data = []byte("Hello,World")
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = UnsafeBytesToString(data)
|
||||
_ = utils.UnsafeBytesToString(data)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkBytesToString2(b *testing.B) {
|
||||
data := []byte("Hello,World")
|
||||
var data = []byte("Hello,World")
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = string(data)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkStringToBytes(b *testing.B) {
|
||||
s := strings.Repeat("Hello,World", 1024)
|
||||
var s = strings.Repeat("Hello,World", 1024)
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = UnsafeStringToBytes(s)
|
||||
_ = utils.UnsafeStringToBytes(s)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkStringToBytes2(b *testing.B) {
|
||||
s := strings.Repeat("Hello,World", 1024)
|
||||
var s = strings.Repeat("Hello,World", 1024)
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = []byte(s)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFormatAddress(t *testing.T) {
|
||||
t.Log(FormatAddress("127.0.0.1:1234"))
|
||||
t.Log(FormatAddress("127.0.0.1 : 1234"))
|
||||
t.Log(FormatAddress("127.0.0.1:1234"))
|
||||
t.Log(utils.FormatAddress("127.0.0.1:1234"))
|
||||
t.Log(utils.FormatAddress("127.0.0.1 : 1234"))
|
||||
t.Log(utils.FormatAddress("127.0.0.1:1234"))
|
||||
}
|
||||
|
||||
func TestFormatAddressList(t *testing.T) {
|
||||
t.Log(FormatAddressList([]string{
|
||||
t.Log(utils.FormatAddressList([]string{
|
||||
"127.0.0.1:1234",
|
||||
"127.0.0.1 : 1234",
|
||||
"127.0.0.1:1234",
|
||||
}))
|
||||
}
|
||||
|
||||
func TestContainsSameStrings(t *testing.T) {
|
||||
var a = assert.NewAssertion(t)
|
||||
a.IsFalse(utils.ContainsSameStrings([]string{"a"}, []string{"b"}))
|
||||
a.IsFalse(utils.ContainsSameStrings([]string{"a", "b"}, []string{"b"}))
|
||||
a.IsFalse(utils.ContainsSameStrings([]string{"a", "b"}, []string{"a", "b", "c"}))
|
||||
a.IsTrue(utils.ContainsSameStrings([]string{"a", "b"}, []string{"a", "b"}))
|
||||
a.IsTrue(utils.ContainsSameStrings([]string{"a", "b"}, []string{"b", "a"}))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user