Go IP 段范围校验
时间:2022-07-25
本文章向大家介绍Go IP 段范围校验,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景
近期做了一个需求,是检测某个 IP 是否在若干 IP 段内,做固定地点 IP 筛查,满足特定业务需求。
解决方案
PLAN A 点分十进制范围区分
简单来讲,就是将 IPv4 原有的四段,分别对比 IP 地址,查看每一段是否在 IP 段范围内,可以用于段控制在每一个特定段 0 ~ 255 内筛选,例如:
192.123.1.0 ~ 192.123.156.255
这样的比较规范的特定段可以实现简单的筛选,但是问题来了,不规则的连续 IP 段怎么排除? 如下:
IP段:192.168.1.0 ~ 192.172.3.255
IP: 192.160.0.255
这样就会出现问题,可以看到按照简单的分段对比,很明显校验不通过,但是这个 IP 还是存在在 IP 段中,方案只能针对统一分段下规则的IP段才可以区分。
PLAN B 转整型对别
IP 地址可以转换为整数,可以将 IP 范围化整为 整数范围进行排查。
这种方式只需要将授为范围内的地址转换为整数,就可以将 IP 排查在外了。
代码
以下是示例代码:
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
ipVerifyList := "192.168.1.0-192.172.3.255"
ip := "192.170.223.1"
ipSlice := strings.Split(ipVerifyList, `-`)
if len(ipSlice) < 0 {
return
}
if ip2Int(ip) >= ip2Int(ipSlice[0]) && ip2Int(ip) <= ip2Int(ipSlice[1]) {
fmt.Println("ip in iplist")
return
}
fmt.Println("ip not in iplist")
}
func ip2Int(ip string) int64 {
if len(ip) == 0 {
return 0
}
bits := strings.Split(ip, ".")
if len(bits) < 4 {
return 0
}
b0 := string2Int(bits[0])
b1 := string2Int(bits[1])
b2 := string2Int(bits[2])
b3 := string2Int(bits[3])
var sum int64
sum += int64(b0) << 24
sum += int64(b1) << 16
sum += int64(b2) << 8
sum += int64(b3)
return sum
}
func string2Int(in string) (out int) {
out, _ = strconv.Atoi(in)
return
}
- 解决Entity Framework查询匿名对象后的跨域访问的一种方式
- WebSocket在ASP.NET MVC4中的简单实现
- 在ASP.NET MVC中使用Unity进行依赖注入的三种方式第一种方法第二种方法第三种方法
- Unity Container中的几种注册方式与示例1.实例注册2.简单类型注册
- 使用Unity创建依赖注入依赖注入生命周期:注册、解析、销毁 注册解析销毁
- 使用WCF进行跨平台开发之三(JAVA调用WCF服务)1.开发必备2.生成WCF客户端3.开发程序4.结束语
- 使用WCF进行跨平台开发之二(IIS托管WCF服务并使用php平台调用)1.系统必备2.在IIS中托管WCF服务3.使用PHP调用托管在IIS中的WCF服务
- 使用WCF进行跨平台开发之一(WCF的实现、控制台托管与.net平台的调用)1.创建项目结构2.契约的设计3.实现服务4.控制台托管服务5.在.net平台中调用WCF
- 使用GUI工具高效构建你自己的Nuget包丰富包的基础信息添加要包含的文件The end
- 网页结构与表现原则
- CSS3动画功能
- Angular开发者手册重点翻译之指令(一)文本和属性绑定ngAttr属性绑定
- CSS3中的变形处理
- WCF中操作的分界于调用顺序和会话的释放操作分界实例停止
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 有意思的 Node.js 内存泄漏问题
- 【技术干货】聊聊在大厂推荐场景中embedding都是怎么做的
- 特征工程|连续特征的常见处理方式(含实例)
- 一个请求过来,Spring MVC 是如何找到正确的 Controller 的?
- 吴师兄导读:如何快速入门数据结构和算法
- 你真的会做 2 Sum 吗?
- 漫画:什么是计数排序?
- vue使用腾讯位置服务选点组件问题总结
- Spring 的 Controller 是单例还是多例?怎么保证并发的安全
- Python游戏开发 制作AI贪吃蛇!
- Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!
- 教你用云开发打造一个双端自动发布的博客体系(下)
- 国科大&中科院提出CANet:用于图像复原的拼接注意力网络
- 【Kubernetes】Octant部署
- 使用注意力机制来做医学图像分割的解释和Pytorch实现