質問

はい、金曜日の午後です。長い週を過ごしたので、助けていただければ幸いです! 現在、次のような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 /

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top