我有一个 go 程序,它接受来自客户端的 URL 并使用 net/http 包获取它们。在进行进一步处理之前,我想检查 URL 是否映射到私有(不可路由/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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)