programing

특정 IP 범위의 입력 IP 하한을 확인하는 방법

closeapi 2023. 7. 5. 20:44
반응형

특정 IP 범위의 입력 IP 하한을 확인하는 방법

사용자가 두 가지 IP 범위(예: 172.16.11.5 - 100)를 입력하도록 허용한다면 IP(172.16.11.50)가 범위에 포함되는지 확인하는 기능을 어떻게 작성할 수 있습니까?

.NET에 활용할 기존 라이브러리가 있습니까?

프레임워크에 내장된 것은 없지만, 가상화 환경을 구축하는 데는 많은 노력이 필요하지 않습니다.IPAddressRange학생들

IP 주소를 호출하여 범위를 비교합니다.하위 주소, 상위 주소 및 비교 주소의 GetAddressBytes.첫 번째 바이트부터 비교 주소가 상위/하위 주소 범위에 있는지 확인합니다.

이 방법은 IPv4 및 IPv6 주소 모두에 대해 작동합니다.

public class IPAddressRange
{
    readonly AddressFamily addressFamily;
    readonly byte[] lowerBytes;
    readonly byte[] upperBytes;

    public IPAddressRange(IPAddress lowerInclusive, IPAddress upperInclusive)
    {
        // Assert that lower.AddressFamily == upper.AddressFamily

        this.addressFamily = lowerInclusive.AddressFamily;
        this.lowerBytes = lowerInclusive.GetAddressBytes();
        this.upperBytes = upperInclusive.GetAddressBytes();
    }

    public bool IsInRange(IPAddress address)
    {
        if (address.AddressFamily != addressFamily)
        {
            return false;
        }

        byte[] addressBytes = address.GetAddressBytes();

        bool lowerBoundary = true, upperBoundary = true;

        for (int i = 0; i < this.lowerBytes.Length && 
            (lowerBoundary || upperBoundary); i++)
        {
            if ((lowerBoundary && addressBytes[i] < lowerBytes[i]) ||
                (upperBoundary && addressBytes[i] > upperBytes[i]))
            {
                return false;
            }

            lowerBoundary &= (addressBytes[i] == lowerBytes[i]);
            upperBoundary &= (addressBytes[i] == upperBytes[i]);
        }

        return true;
    }
}

NB: 위의 코드를 확장하여 공용 정적 팩토리 메서드를 추가할 수 있습니다.FromCidr(IPAddress address, int bits)

이 라이브러리는 "192.168.0.0/24" 및 "192.168.0.0/255.255.0" 및 "192.168.0.0-192.168.0.0.255"와 같은 IP 주소 문자열 범위를 구문 분석할 수 있으며 체크를 포함할 수 있습니다.이 라이브러리는 IPv4 및 IPv6를 모두 지원합니다.

https://github.com/jsakamoto/ipaddressrange

NuGet을 통해 설치할 수도 있습니다.

http://www.nuget.org/packages/IPAddressRange/

using NetTools;
...
// rangeA.Begin is "192.168.0.0", and rangeA.End is "192.168.0.255".
var rangeA = IPAddressRange.Parse("192.168.0.0/255.255.255.0");
rangeA.Contains(IPAddress.Parse("192.168.0.34")); // is True.
rangeA.Contains(IPAddress.Parse("192.168.10.1")); // is False.
rangeA.ToCidrString(); // is 192.168.0.0/24

// rangeB.Begin is "192.168.0.10", and rangeB.End is "192.168.10.20".
var rangeB1 = IPAddressRange.Parse("192.168.0.10 - 192.168.10.20");
rangeB1.Contains(IPAddress.Parse("192.168.3.45")); // is True.
rangeB1.Contains(IPAddress.Parse("192.168.0.9")); // is False.

// Support shortcut range description. 
// ("192.168.10.10-20" means range of begin:192.168.10.10 to end:192.168.10.20.)
var rangeB2 = IPAddressRange.Parse("192.168.10.10-20");

// Support CIDR expression and IPv6.
var rangeC = IPAddressRange.Parse("fe80::/10"); 
rangeC.Contains(IPAddress.Parse("fe80::d503:4ee:3882:c586%3")); // is True.
rangeC.Contains(IPAddress.Parse("::1")); // is False.
public static bool IsInRange(string startIpAddr, string endIpAddr, string address)
{
    long ipStart = BitConverter.ToInt32(IPAddress.Parse(startIpAddr).GetAddressBytes().Reverse().ToArray(), 0);

    long ipEnd = BitConverter.ToInt32(IPAddress.Parse(endIpAddr).GetAddressBytes().Reverse().ToArray(), 0);

    long ip = BitConverter.ToInt32(IPAddress.Parse(address).GetAddressBytes().Reverse().ToArray(), 0);

    return ip >= ipStart && ip <= ipEnd; //edited
}

Console.WriteLine(IsInRange("100.0.0.1", "110.0.0.255", "102.0.0.4"));//true

이러한 주소를 정수로 변환한 다음 비교를 수행하는 것이 가장 좋습니다.

여기서 예: IP에서 정수로

IP 주소를 정수로 변환하려면 4개의 옥텟으로 나눕니다.예를 들어 제공한 IP 주소는 다음과 같이 나눌 수 있습니다.

First Octet:    217
Second Octet:   110
Third Octet:    18
Fourth Octet:   206

점선 문자열에서 십진수 주소를 계산하려면 다음 계산을 수행합니다.

    (first octet * 256³) + (second octet * 256²) + (third octet * 256) + (fourth octet)
=   (first octet * 16777216) + (second octet * 65536) + (third octet * 256) + (fourth octet)
=   (217 * 16777216) + (110 * 65536) + (18 * 256) + (206)
=   3647869646

IPv6을 고려하여 정수(128비트 대 32비트 IPv4)로 변환할 수도 있습니다.다음 질문을 살펴 보십시오.C#에서 IPv6를 int로 포맷하고 SQL Server에 저장

가장 간단한 방법은 여러분을 위해 이를 수행할 프레임워크를 얻는 것입니다.사용하다IPAddress.Parse는 주를구분석면려하문, 다음그소▁to다▁then▁the음,.IPAddress.GetAddressBytes를 "숫자"로 받다byte[].

저는 코드 프로젝트에서 이 코드를 사용한 적이 있는데, 이 코드는 당신에게 유용할 수 있습니다.

http://www.codeproject.com/KB/IP/ipnumbers.aspx

에 할 수 .IPList보낸 사람 IP 및 보낸 사람 IP 번호로 정의된 IP 번호 범위.메소드는 범위를 표준 IP 범위로 나누고 마스크를 찾습니다.따라서 "10.0.0.5"에서 "10.0.0.20"까지의 범위가 10.0.0.5, 10.0.0.20, 10.0.0.6/31, 10.0.0.16/30 및 10.0.0.8/29의 범위로 분할되어 목록에 추가되며 이에 대해 확인할 수 있습니다.

고지 사항:클래스는 단순 데이터 세트로만 테스트되며 클래스에는 제공된 IP 번호 및 IP 마스크의 유효성 검사가 부족합니다.이 문제는 프로덕션 환경에서 사용하기 전에 해결해야 합니다.

여기에서 내 답변을 다시 게시합니다.

얼마 전에, 나는 주어진 IP의 위치를 찾아야 했습니다.우리는 요청에서 IP를 얻었습니다.이 매핑을 제공한 무료 데이터베이스가 있습니다.IPv4에서, 우리가 IP를 "a.b.c.d"라고 말할 때, 그것은 본질적으로.a * (256^3) + b * (256^2) + c * (256) + d.

http://www.aboutmyip.com/AboutMyXApp/IP2Integer.jsp

따라서 "a"로 시작하는 IP 주소를 원한다고 말할 때, *256^3 + 256 * (256^2) (b = 256) + 256 * (256) + 256 * (c = 256) + 256 (d = 256) 사이의 IP를 찾습니다(하한/상한은 제한을 포함/제한할지 여부에 따라 약간 달라질 수 있습니다).

즉, 특정 목적을 위해 예약된 특정 IP가 있습니다(예: 127.0.0.1(localhost), 0.0.0.0은 IP일 수 없음).

그래서 당신의 linq 쿼리는

from i in iList where i >= MIN && i <= MAX select i;

여기서 iList는 초기 목록입니다. MIN은 범위의 최소값입니다. MAX는 범위의 최대값입니다.

당신의 IP 범위에서 서브넷 마스크를 알아낼 수 있습니까?

그렇다면 IsInSameSubnet 메서드를 사용할 수 있습니다.

나는 위의 NuGet의 IPAddressRange 패키지를 추천하는 +1 BudhiP의 답변을 원합니다: https://www.nuget.org/packages/IPAddressRange/

그러나 코드 형식 지정은 주석에서 어렵기 때문에 IPAddressRange를 사용하는 방법에 대한 실용적인 코드 예제를 여기에 추가하겠습니다.

Check IPWhitelist는 IPWhitelist라는 설정을 읽고 IPAddressRange가 구문 분석할 수 있는 세미콜론으로 구분된 IP 범위 목록(예: "192.168.10.10-20; 192.168.125.1-150; 192.168.123.1-150")을 가정합니다.이 함수는 범위와 의지를 반복하고 있으면 true를 반환하며, 없으면 false를 반환합니다.

이 함수는 VB.NET이며 일부 ASP.NET 종속성(예: 시스템)이 있다고 가정합니다.Web.HttpRequest 네임스페이스)

Imports NetTools ' ref. https://www.nuget.org/packages/IPAddressRange/

Function CheckIPWhitelist() As Boolean
    Dim match As Boolean = False
    Dim SourceIP As String = Request.UserHostAddress()

    ' Examples of valid IPWhitelist ranges 
    ' one range in longhand range format: "192.168.0.10 - 192.168.10.20"
    ' one range in shorthand range format: "192.168.10.10-20"
    ' multiple ranges separated by semicolons in shorthand range format: "192.168.10.10-20;192.168.125.1-150;192.168.123.1-150"
    Dim IPWhitelist As String = ConfigurationManager.AppSettings("IPWhitelist")

    Dim arrRanges As String() = IPWhitelist.Split(";")
    For i As Integer = 0 To arrRanges.Length - 1
        If arrRanges(i) IsNot Nothing Then
            Dim range As NetTools.IPAddressRange = IPAddressRange.Parse(arrRanges(i))
            If range.Contains(IPAddressRange.Parse(SourceIP)) = True Then
                match = True ' IP is in the whitelist, set a boolean
                Exit For
            End If
        End If
    Next
    Return match
End Function

중간에 있는 점을 제거하고 처음에는 모든 IP를 long으로 변환한 다음 if:

var givenIp = Convert.ToInt64(clientIp.Replace(".", ""));
var startIp = Convert.ToInt64(startRange.Replace(".", ""));
var endIp = Convert.ToInt64(endRange.Replace(".", ""));

if (givenIp != startIp && givenIp != endIp && (givenIp < startIp || givenIp > endIp))
{
   Console.WriteLine("your ip does not allow to access!");
}

언급URL : https://stackoverflow.com/questions/2138706/how-to-check-a-input-ip-fall-in-a-specific-ip-range

반응형