C# 如何检查特定IP范围内的输入IP下降

C# 如何检查特定IP范围内的输入IP下降,c#,asp.net,C#,Asp.net,如果我们让用户输入几个ip范围,例如172.16.11.5-100,我如何编写函数来检查ip(172.16.11.50)是否在这些范围内 .NET中是否有可用的库?最好将这些地址转换为整数,然后执行比较 示例如下: 要将IP地址转换为整数,请将其拆分为四个八位字节。例如,您提供的ip地址可以分为: First Octet: 217 Second Octet: 110 Third Octet: 18 Fourth Octet: 206 要从虚线字符串计算十进制地址,请执行以下

如果我们让用户输入几个ip范围,例如172.16.11.5-100,我如何编写函数来检查ip(172.16.11.50)是否在这些范围内


.NET中是否有可用的库?

最好将这些地址转换为整数,然后执行比较

示例如下:

要将IP地址转换为整数,请将其拆分为四个八位字节。例如,您提供的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)。看看这个问题:

最简单的方法是获得 框架来为你做这件事。使用
IPAddress.Parse
要解析地址, 然后
IPAddress.GetAddressBytes
获取 “数字”为
字节[]


框架中没有内置任何内容,但创建
IPAddressRange
类并不需要太多努力

您可以通过调用较低地址、较高地址和比较地址来比较范围。从第一个字节开始,检查比较地址是否在上/下地址的范围内

此方法适用于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;
    }
}
公共类IPAddressRange
{
只读地址家庭地址家庭;
只读字节[]低字节;
只读字节[]上限字节;
公共IPAddressRange(IPAddress lowerInclusive,IPAddress Upper Inclusive)
{
//断言lower.AddressFamily==upper.AddressFamily
this.addressFamily=lowerInclusive.addressFamily;
this.lowerBytes=lowerInclusive.GetAddressBytes();
this.upperBytes=upperInclusive.GetAddressBytes();
}
公共bool IsInRange(IPAddress地址)
{
如果(address.AddressFamily!=AddressFamily)
{
返回false;
}
byte[]addressBytes=地址。GetAddressBytes();
布尔下限=真,上限=真;
对于(int i=0;i上限字节[i]))
{
返回false;
}
lowerBoundary&=(addressBytes[i]==lowerBytes[i]);
上限&=(地址字节[i]==上限字节[i]);
}
返回true;
}
}
注意:上述代码可以扩展为添加来自CIDR(IP地址地址,int位)的公共静态工厂方法

您能从您的IP范围中找出正确的方法吗


如果是这样的话,也许你可以使用这个方法。

我以前在codeproject上使用过这个代码,这可能对你有用

您可以向
IPList
添加由From IP和to 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

所以,当你说你想要一个以“a”开头的IP地址时,你是在寻找a*256^3和a*256^3+256*(256^2)(b=256)+256*(256)(c=256)+256(d=256)之间的IP地址(下限/上限可能会有所不同,这取决于你是否想要包括/排除这些限制)

也就是说,有一些特定的IP是为特定目的保留的(比如127.0.0.1是本地主机,0.0.0.0不能是IP等等)

因此,您的linq查询将是

from i in iList where i >= MIN && i <= MAX select i;
来自iList中的i,其中i>=MIN&&i
公共静态bool IsInRange(字符串startIpAddr、字符串endIpAddr、字符串地址)
{
long ipStart=BitConverter.ToInt32(IPAddress.Parse(startIpAddr.GetAddressBytes().Reverse().ToArray(),0);
long ipEnd=BitConverter.ToInt32(IPAddress.Parse(endIpAddr.GetAddressBytes().Reverse().ToArray(),0);
长ip=BitConverter.ToInt32(IPAddress.Parse(address.GetAddressBytes().Reverse().ToArray(),0);

返回IP>= IPStand & IP

您可能想通过@ JSAKAMOTO来考虑这个库,它允许您解析IP地址字符串的范围,例如“192.1680.0/24”和“192.1680.25/255.255.255.0”和“192.1680.0 192.1680.255”,并且可以CONATIN检查。这个库既支持IPv4又支持IPv6。

也可以通过NuGet安装:


我想看看上面的+1 BuddhiP的答案,它推荐NuGet的IPAddressRange软件包:

但是,由于注释中的代码格式很难设置,我将在这里添加一个实用的代码示例,介绍如何使用IPAddressRange

CheckIPWhitelist读取一个名为IPWhitelist的设置,并假设IPAddressRange可以解析的IP范围(如“192.168.10.10-20;192.168.125.1-150;192.168.123.1-150”)的分号分隔列表。该函数迭代这些范围,如果存在,则返回true,如果未找到,则返回false

此函数为VB.NET,并假设存在某些ASP.NET依赖项(例如System.Web.HttpRequest命名空间)


这不适用于IPv6地址,
IPAddress
类支持IPv6地址。需要注意的是,如果您实施此操作是为了查看某个IP是否位于特定子网上,则无法可靠地执行此操作
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
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.
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