gpt4 book ai didi

go - 检查IP地址是否在私网空间

转载 作者:IT王子 更新时间:2023-10-29 01:10:32 24 4
gpt4 key购买 nike

我有一个 go 程序,它接受来自客户端的 URL 并使用 net/http 包获取它们。在进行进一步处理之前,我想检查 URL 是否映射到私有(private)(不可路由/RFC1918 网络)地址空间。

直接的方法是执行显式 DNS 请求并检查已知专用范围的地址。之后,对 URL 执行 HTTP GET 请求。

有没有更好的方法来实现这一点?最好与 http.Client 集成,以便它可以作为 GET 请求的一部分执行。

最佳答案

您可能还想包括对环回(IPv4 或 IPv6)和/或 IPv6 链路本地或唯一本地地址的检查。下面是一个示例,其中包含 RFC1918 地址列表以及其他地址,并作为 isPrivateIP(ip net.IP) 对它们进行简单检查:

var privateIPBlocks []*net.IPNet

func init() {
for _, cidr := range []string{
"127.0.0.0/8", // IPv4 loopback
"10.0.0.0/8", // RFC1918
"172.16.0.0/12", // RFC1918
"192.168.0.0/16", // RFC1918
"169.254.0.0/16", // RFC3927 link-local
"::1/128", // IPv6 loopback
"fe80::/10", // IPv6 link-local
"fc00::/7", // IPv6 unique local addr
} {
_, block, err := net.ParseCIDR(cidr)
if err != nil {
panic(fmt.Errorf("parse error on %q: %v", cidr, err))
}
privateIPBlocks = append(privateIPBlocks, block)
}
}

func isPrivateIP(ip net.IP) bool {
if ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() {
return true
}

for _, block := range privateIPBlocks {
if block.Contains(ip) {
return true
}
}
return false
}

关于go - 检查IP地址是否在私网空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41240761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com