好的,这是星期五下午,我已经度过了漫长的一周,所以会感激一些帮助! 目前,我有一个IP范围列表,如下所示:
List<IPRange> ipRanges = new List<IPRange>();
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基本上只是十进制数字,但我不确定它是如何工作的。
以前有人遇到过这个吗?
干杯,肖恩。
答案 0 :(得分:7)
转换每个IP地址to number,然后检查用户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;
}
}
答案 1 :(得分:7)
我会将IP地址转换为32位数字,然后执行简单的&gt; = From和&lt; =检查它是否在范围内。
例如,192.168.1.1 - &gt; 192 * 256 ^ 3 + 168 * 256 ^ 2 + 1 * 256 + 1。
使用您的值,145.36.0.0 - &gt; 2435055616和145.36.0.0 - &gt; 2435121151.所以145.36.200.30 - &gt; 2435106846,并且属于该范围,所以它是有效的。但是145.35.255.255 - &gt; 2435055615不在范围内(只是勉强),所以它失败了。
答案 2 :(得分:1)
我会编写我的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转换为名称int形式并进行简单比较。
public bool IsInRange(string ipStr)
{
int ip = ConvertIPStringToInt(ipStr);
return (from <= ip && ip <= to);
}
这样,每次检查时,您都不必按时间段分割IP。
答案 3 :(得分:1)
只是为了好玩(以及一些完整性) - 另一种显而易见的方法是确保在存储为字符串时始终对IP地址的每个段使用3位数,即145.36.0.0应为145.036。 000.000-这样的字符串可以直接比较。
不那么明显的是拥有一个显式的IP地址类并滚动你自己的一组比较逻辑(我轻率地假设已经没有这样的东西埋藏在.NET框架的深处。 ..)
答案 4 :(得分:0)
我几天前读过这篇文章。
您可以转换和比较您的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/