4

さて、それは金曜日の午後です、そして私は長い週を過ごしたので、いくつかの助けをいただければ幸いです!現在、次のような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進数にすぎないことは知っていますが、それがどのように機能するかはよくわかりません。

誰かがこれに遭遇したことがありますか?

乾杯、ショーン。

4

5 に答える 5

7

各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;
    }
}
于 2009-10-23T14:58:08.870 に答える
7

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は範囲内にないため(かろうじて)、失敗します。

于 2009-10-23T14:59:21.677 に答える
1

楽しみのために(そして完全性のいくつかの類似点)-これを行うためのもう1つの明白な方法は、文字列として保存するときにIPアドレスの各セグメントに常に3桁を使用するようにすることです。つまり、145.36.0.0は145.036.000.000である必要があります。文字列が直接比較できる方法。

そして、それほど明白ではないのは、明示的なIPアドレスクラスを持ち、独自の比較ロジックのセットをロールすることです(.NETフレームワークの奥深くにこのようなものがまだ埋もれていないと思い込んでいます...)

于 2009-10-23T15:26:19.640 に答える
1

ゲッター/セッターが内部で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を期間ごとに分割する必要がありません。

于 2009-10-23T15:16:04.997 に答える
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/

于 2009-10-23T15:00:35.277 に答える