특정 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
'programing' 카테고리의 다른 글
일반 개체를 mongoose 문서에 캐스팅 (0) | 2023.07.05 |
---|---|
일부 JSON 파일을 Spring Boot 응용 프로그램에 로드하는 가장 좋은 방법 (0) | 2023.07.05 |
MongoDB에서 _id 유형을 정수로 변경하는 것이 나쁜가요? (0) | 2023.07.05 |
시스템을 찾을 수 없습니다.거미줄. (0) | 2023.07.05 |
Cloud Firestore에서 기존 번호 필드를 늘리는 방법 (0) | 2023.07.05 |