检查用户的 IP 地址是否在 IP 范围内



在我的Python应用程序中,我有一个IP地址字符串数组,如下所示:

[
    "50.28.85.81-140", // Matches any IP address that matches the first 3 octets, and has its final octet somewhere between 81 and 140
    "26.83.152.12-194" // Same idea: 26.83.152.12 would match, 26.83.152.120 would match, 26.83.152.195 would not match
]

我安装了netaddr,尽管文档看起来很棒,但我无法理解它。这必须非常简单 - 如何检查给定的 IP 地址是否与这些范围之一匹配?不需要特别使用netaddr - 任何简单的 Python 解决方案都可以。

这个想法是拆分 IP 并分别检查每个组件。

mask = "26.83.152.12-192"
IP = "26.83.152.19"
def match(mask, IP):
   splitted_IP = IP.split('.')
   for index, current_range in enumerate(mask.split('.')):
      if '-' in current_range:
         mini, maxi = map(int,current_range.split('-'))
      else:
         mini = maxi = int(current_range)
      if not (mini <= int(splitted_IP[index]) <= maxi):
         return False
   return True

不确定这是最优化的,但这是基础python,不需要额外的包。

  • 解析ip_range ,创建一个列表,其中包含 1 个元素 if 简单值和一个 range if 范围。因此,它创建了一个包含 4 个 int/range 对象的列表。
  • 然后用您的地址的split版本zip它,并测试另一个范围内的每个值

注意:使用 range 可确保超快速的in测试(在 Python 3 中)(为什么在 Python 3 中"1000 1000000000000001

000000000000000"如此之快?
ip_range = "50.28.85.81-140"
toks = [[int(d)] if d.isdigit() else range(int(d.split("-")[0]),int(d.split("-")[1]+1)) for d in ip_range.split(".")]
print(toks) # debug
for test_ip in ("50.28.85.86","50.284.85.200","1.2.3.4"):
    print (all(int(a) in b for a,b in zip(test_ip.split("."),toks)))

结果(如预期):

[[50], [28], [85], range(81, 140)]
True
False
False

相关内容

  • 没有找到相关文章

最新更新