IP範囲内にある場合のIPの制限
-
06-07-2019 - |
質問
はい、金曜日の午後です。長い週を過ごしたので、助けていただければ幸いです! 現在、次のような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は基本的に単なる10進数であることは知っていますが、それがどのように機能するかはよくわかりません。
これに遭遇した人はいますか?
乾杯、ショーン。
解決
各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ビットの数値に変換してから、単純な<!> 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は範囲内にないため(わずかに)、失敗します。
ゲッター/セッターがIP文字列を内部的に数値に変換するようにIPRangeクラスを作成します:
new IPRange { From = "145.36.0.0", To = "145.36.255.255" }
内部で設定されます:
int from = 145036000000;
int to = 145036255255;
次に、着信IPを名前int形式に変換し、単純な比較を行う.IsInRange(string ip)メソッドを追加します。
public bool IsInRange(string ipStr)
{
int ip = ConvertIPStringToInt(ipStr);
return (from <= ip && ip <= to);
}
この方法では、チェックするたびに範囲内のIPを期間で分割する必要はありません。
楽しみのために(および完全性の見た目)-これを行うもう1つの明白な方法は、文字列として保存する場合、145.36.0.0が145.036である場合、IPアドレスの各セグメントに常に3桁を使用することです。 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 /