如果IP位于IP范围之间,则限制IP

好的,这是星期五下午,我已经度过了漫长的一周,所以我会感激一些帮助! 目前,我有一个IP范围列表,如下所示:

List ipRanges = new List(); ipRanges.Add(new IPRange { From = "145.36.0.0", To = "145.36.255.255" }); ipRanges.Add(new IPRange { From = "194.183.227.184", To = "194.183.227.191" }); ipRanges.Add(new IPRange { From = "193.131.192.0", To = "193.131.223.255" }); 

获得客户端的IP后,如果它落在这些范围集之间的任何位置,则需要将其重定向到其他位置。

例如,

如果有人使用IP 192.168.0.1访问了该站点,则允许他们访问。 如果他们访问了145.36.1.0 ,则不允许他们访问,因为它位于该列表中的第一个范围之间。

我可以按周期拆分每个IP,并计算出范围开始变化的位置,然后进行比较,但这在服务器上会很重。

我知道IP基本上只是十进制数,但我不确定它是如何工作的。

有没有人遇到过这个?

干杯,肖恩。

将每个IP地址转换为数字 ,然后检查用户IP地址是否在这些数字之间。

 public double Dot2LongIP(string DottedIP) { int i; string [] arrDec; double num = 0; if (DottedIP == "") { return 0; } else { arrDec = DottedIP.Split('.'); for(i = arrDec.Length - 1; i >= 0 ; i --) { num += ((int.Parse(arrDec[i])%256) * Math.Pow(256 ,(3 - i ))); } return num; } } 

我会将IP地址转换为32位数,然后执行简单的> = From和<=检查它是否在范围内。

例如,192.168.1.1 – > 192 * 256 ^ 3 + 168 * 256 ^ 2 + 1 * 256 + 1。

使用您的值,145.36.0.0 – > 2435055616和145.36.0.0 – > 2435121151.所以145.36.200.30 – > 2435106846,并且属于该范围,因此它是有效的。 但是145.35.255.255 – > 2435055615不在范围内(只是勉强),所以它失败了。

我会编写我的IPRange类,以便getter / setter在内部将IP字符串转换为数字:

 new IPRange { From = "145.36.0.0", To = "145.36.255.255" } 

内部设定:

 int from = 145036000000; int to = 145036255255; 

然后添加一个.IsInRange(string ip)方法,该方法将传入的IP转换为名称intforms并进行简单比较。

 public bool IsInRange(string ipStr) { int ip = ConvertIPStringToInt(ipStr); return (from <= ip && ip <= to); } 

这样,每次检查时,您都不必按时间段分割IP。

只是为了好玩(以及一些完整性的外观) – 另一种显而易见的方法是确保在存储为字符串时始终对IP地址的每个段使用3位数,即145.36.0.0应为145.036.000.000 – 字符串的方式可以直接比较。

不太明显的是拥有一个显式的IP地址类,并且滚动你自己的一组比较逻辑(我轻率地假设在.NET框架的深处已经没有这样的东西……)

我几天前读过这篇文章。

您可以转换和比较您的IP范围。

 IF exists (SELECT * from dbo.sysobjects WHERE id = object_id(N'[dbo].[IsPrivateIP]') AND OBJECTPROPERTY(id, N'IsScalarFunction') = 1) DROP FUNCTION [dbo].[IsPrivateIP] GO CREATE FUNCTION dbo.IsPrivateIP( @vcIPAddress varchar(15)) /************************************************************************** DESCRIPTION: Returns Numeric IP if not private, otherwise returns null PARAMETERS: @vcIPAddress - The string containing a valid IP RETURNS: IP converted to bigint or null if a private IP USAGE: SELECT dbo.IsPrivateIP( '207.158.26.10') DEPENDANCIES: dbo.IPStringToNumber() function AUTHOR: Karen Gayda DATE: 06/11/2003 MODIFICATION HISTORY: WHO DATE DESCRIPTION --- ---------- --------------------------------------------------- ***************************************************************************/ RETURNS bigint AS BEGIN DECLARE @biClassALo bigint , @biClassAHi bigint , @biClassBLo bigint , @biClassBHi bigint , @biClassCLo bigint , @biClassCHi bigint , @biIP bigint, @bTemp int SET @biClassALo = 167772160 SET @biClassAHi = 169549375 SET @biClassBLo = 2885681152 SET @biClassBHi = 2887778303 SET @biClassCLo = 3232235520 SET @biClassCHi = 3232301055 SET @biIP = dbo.IPStringToNumber(@vcIPAddress) IF @biIP BETWEEN @biClassALo AND @biClassAHi OR @biIP BETWEEN @biClassBLo AND @biClassBHi OR @biIP BETWEEN @biClassCLo AND @biClassCHi SET @biIP = NULL RETURN @biIP END GO 

这是它需要的IPStringToNumber函数:

 IF exists (SELECT * from dbo.sysobjects WHERE id = object_id(N'[dbo].[IPStringToNumber]') AND OBJECTPROPERTY(id, N'IsScalarFunction') = 1) DROP FUNCTION [dbo].[IPStringToNumber] GO CREATE FUNCTION dbo.IPStringToNumber( @vcIPAddress varchar(15)) /************************************************************************** DESCRIPTION: Returns Numeric IP, otherwise returns null PARAMETERS: @vcIPAddress - The string containing a valid IP RETURNS: IP converted to bigint or null if not a valid IP USAGE: SELECT dbo.IPStringToNumber( '10.255.255.255') AUTHOR: Karen Gayda DATE: 06/11/2003 MODIFICATION HISTORY: WHO DATE DESCRIPTION --- ---------- --------------------------------------------------- ***************************************************************************/ RETURNS bigint AS BEGIN DECLARE @biOctetA bigint, @biOctetB bigint, @biOctetC bigint, @biOctetD bigint, @biIP bigint DECLARE @tblArray TABLE ( OctetID smallint, --Array index Octet bigint --Array element contents ) --split the IP string and insert each octet into a table row INSERT INTO @tblArray SELECT ElementID, Convert(bigint,Element) FROM dbo.Split(@vcIPAddress, '.') --check that there are four octets and that they are within valid ranges IF (SELECT COUNT(*) FROM @tblArray WHERE Octet BETWEEN 0 AND 255) = 4 BEGIN SET @biOctetA = (SELECT (Octet * 256 * 256 * 256) FROM @tblArray WHERE OctetID = 1) SET @biOctetB = (SELECT (Octet * 256 * 256 ) FROM @tblArray WHERE OctetID = 2) SET @biOctetC = (SELECT (Octet * 256 ) FROM @tblArray WHERE OctetID = 3) SET @biOctetD = (SELECT (Octet) FROM @tblArray WHERE OctetID = 4) SET @biIP = @biOctetA + @biOctetB + @biOctetC + @biOctetD END RETURN(@biIP) END 

参考文献:

http://www.sqlservercentral.com/scripts/Miscellaneous/31036/

http://www.sqlservercentral.com/Authors/Scripts/kgayda/17134/