检查 IP 地址是否在给定范围内

Checking if IP address lies within a given range

我想检查 IP 180.179.77.11 是否位于特定范围内,比如 180.179.0.0 - 180.179.255.255

我编写了一个函数,它将每个 IP 八位字节与其他八位字节进行比较。

def match(mask, IP):
    min_ip = mask.split(' - ')[0].split('.')
    max_ip = mask.split(' - ')[1].split('.')
    ip = IP.split('.')
    for i in range(4):
        print ip[i] + " < " + min_ip[i] + " or " + ip[i] + " > " + max_ip[i]
        print ip[i] < min_ip[i] or ip[i] > max_ip[i]
        if ip[i] < min_ip[i] or ip[i] > max_ip[i]:
            return False
    return True


match("180.179.0.0 - 180.179.255.255", "180.179.77.11")

输出:

180 < 180 or 180 > 180
False
179 < 179 or 179 > 179
False
77 < 0 or 77 > 255  # 77 > 255 is true
True
False

但是,它似乎不能正常工作;比较 77255 时,问题似乎出现在第 3 个八位字节中。

我已经放了一些打印语句来说明问题区域。

您正在比较 strings 值(按字典顺序比较)而不是每个 IP 的 int 值,将它们转化为具有理解力的整数:

min_ip = [int(i) for i in mask.split(' - ')[0].split('.')]
max_ip = [int(i) for i in mask.split(' - ')[1].split('.')]
ip = [int(i) for i in IP.split('.')]

最好不要对mask中的每个ip进行两次拆分;手前拆分:

s = mask.split(' - ')
min_ip, max_ip = [[int(i) for i in j.split('.')] for j in s]

如果您将 enumerateip 一起使用,您的 for 循环可以说会更好:

for ind, val in enumerate(ip):
    if val < min_ip[ind] or val > max_ip[ind]:
        return False

当您调用匹配函数时,传入的字符串会根据八位字节进行拆分。然而,当进行比较时,被比较的八位字节仍然是一个字符串。因此第三个八位字节为 '7' > '2'。如果将每个八位字节转换为整数,如:

if int(ip[i]) < int(min_ip[i]) or int(ip[i]) > int(max_ip[i]):

您将得到预期的响应。

你的脚本有问题 - 你比较的是字符串而不是数字。

你可以试试这个:

def match(mask, IP):
    min_ip = mask.split(' - ')[0].split('.')
    print min_ip
    max_ip = mask.split(' - ')[1].split('.')
    print max_ip
    ip = IP.split('.')
    print ip
    for i in range(4):
        if int(ip[i]) < int(min_ip[i]) or int(ip[i]) > int(max_ip[i]):
            return False
    return True
print(match("180.179.0.0 - 180.179.255.255", "180.179.77.11"))

没有循环,希望有用。

def match(mask, IP):
    min_ip = mask.split(' - ')[0].split('.')
    max_ip = mask.split(' - ')[1].split('.')
    range4 = range(int(min_ip[-2]), int(max_ip[-2]) + 1)
    range3 = range(int(min_ip[-1]), int(max_ip[-1]) + 1)

    ip = IP.split(".")
    if ( (int(ip[-2]) in range3) and (int(ip[-1]) in range4) ):
        return True

    return False

print match("180.179.0.0 - 180.179.255.255", "180.179.77.11")