简体   繁体   English

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

[英]Check if user's IP address is in a range of IP's

In my Python application I have an array of IP address strings which looks something like this: 在我的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
]

I installed netaddr and although the documentation seems great, I can't wrap my head around it. 我安装了netaddr ,虽然文档看起来很棒,但我无法绕过它。 This must be really simple - how do I check if a given IP address matches one of these ranges? 这一定非常简单 - 如何检查给定的IP地址是否与这些范围之一匹配? Don't need to use netaddr in particular - any simple Python solution will do. 不需要特别使用netaddr - 任何简单的Python解决方案都可以。

The idea is to split the IP and check every component separately. 我们的想法是拆分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

Not sure this is the most optimal, but this is base python, no need for extra packages. 不确定这是最优的,但这是基础python,不需要额外的包。

  • parse the ip_range , creating a list with 1 element if simple value, and a range if range. 解析ip_range ,创建一个列表,如果是简单值,则包含1个元素,如果是range则创建范围。 So it creates a list of 4 int/range objects. 因此它创建了一个包含4个int / range对象的列表。
  • then zip it with a split version of your address and test each value in range of the other 然后用你的地址的split版本zip它,并测试另一个的范围内的每个值

Note: Using range ensures super-fast in test (in Python 3) ( Why is "1000000000000000 in range(1000000000000001)" so fast in Python 3? ) 注意:使用range ,确保超高速in测试(在Python 3)( 为什么是“位于范围千兆(千万亿○一)”在Python 3这么快?

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)))

result (as expected): 结果(如预期):

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM