Как проверить блокировку IP-сети? - PullRequest
0 голосов
/ 01 мая 2019

Здесь я проверяю, попадает ли IP-адрес в указанный диапазон, то есть между самым низким номером IP и самым высоким. Я пробовал некоторые найденные сценарии, которые проходили через массив, но они давали ложные ответы. Поэтому я разбил его, используя приведенный ниже код, который работал в течение 2 дней, пока он не попал в следующий диапазон сети:

IP address = 40.77.167.163
Low = 40.74.0.0
High = 40.125.127.255

function validateIP(ip, low, high)

    validateIP = False
    Dim ipArray, lowArray, highArray, ipTotal

    ipArray = split(ip, ".")
    lowArray = split(low, ".")
    highArray = split(high, ".")

    if CInt(ipArray(3)) >= CInt(lowArray(3)) And CInt(ipArray(3)) <= CInt(highArray(3))then
        validate3 = "1"
    end if
    if CInt(ipArray(2)) >= CInt(lowArray(2)) And CInt(ipArray(2)) <= CInt(highArray(2))then
        validate2 = "1"
    end if
    if CInt(ipArray(1)) >= CInt(lowArray(1)) And CInt(ipArray(1)) <= CInt(highArray(1))then
        validate1 = "1"
    end if
    if CInt(ipArray(0)) >= CInt(lowArray(0)) And CInt(ipArray(0)) <= CInt(highArray(0))then
        validate0 = "1"
    end if

    ipTotal = validate0 & validate1 & validate2 & validate3
    if ipTotal = "1111" then
       validateIP = True
    end if

end function

По какой-то причине, которая мне не подходит, она не работает с этими значениями. Но это с меньшими блоками.

1 Ответ

2 голосов
/ 01 мая 2019

Если вы проверяете адреса IPV4, тогда довольно просто преобразовать IP-адреса в числа и проверить, находится ли данный IP-адрес между вашими низкими и высокими диапазонами (хотя преобразование адресов IPV6 в числа немного сложнее, особенно в VBScript)

Function ipv4ToNumber(ByVal ipv4)

    Dim i, pos, PrevPos, num

    For i = 1 To 4

        pos = InStr(PrevPos + 1, ipv4, ".", 1)
        If i = 4 Then pos = Len(ipv4) + 1
        num = Int(Mid(ipv4, PrevPos + 1, pos - PrevPos - 1))
        PrevPos = pos
        ipv4ToNumber = ((num Mod 256) * (256 ^ (4 - i))) + ipv4ToNumber

    next

End function

Function validateIP(ByVal ip, ByVal Low, ByVal High)

    ip = ipv4ToNumber(ip)
    Low = ipv4ToNumber(Low)
    High = ipv4ToNumber(High)

    If ip >= Low AND ip <= High Then
        validateIP = True
    Else
        validateIP = False
    End If

End Function

validateIP ( "40.77.167.163", "40.74.0.0", "40.125.127.255")

Выход:

Правда


РЕДАКТИРОВАТЬ: Если какие-либо разработчики Classic ASP хотят преобразовать адреса IPV6 в числа, использование VBScript (насколько я знаю) невозможно, но это можно сделать в MySQL:

Function ipv6ToNumber(ByVal ipv6)

    Dim SQL : SQL = "SELECT CAST(" &_
        "CONV(" &_
            "SUBSTR(" &_
                "HEX(" &_
                    "INET6_ATON('" & ipv6 & "')" &_
                ")" &_
            ",1,16)" &_
        ",16,10" &_
    ")AS DECIMAL(65))" &_
    "*18446744073709551616" &_
    "+CAST(" &_
        "CONV(" &_
            "SUBSTR(" &_
                "HEX(" &_
                    "INET6_ATON('" & ipv6 & "')" &_
                ")" &_
            ",17,16)" &_
        ",16,10" &_
    ") AS DECIMAL(65))"

    'ipv6ToNumber = Execute using MySQL and return the number

End Function

Или используйте серверный JavaScript:

<script language="javascript" type="text/javascript" runat="server">

    function ipv6ToNumber(ip) {

        ip.replace("::",":0:0:0:")

        var parts = [];
        ip.split(":").forEach(function(it) {
            var bin = parseInt(it, 16).toString(2);
            while (bin.length < 16) {
                bin = "0" + bin;
            }
            parts.push(bin);
        })
        var bin = parts.join("");

        var dec = bigInt(bin, 2).toString();

        return dec;

    }

</script>
...