문제

좋아, 금요일 오후이고, 나는 긴 주를 보냈으므로 도움을 주셔서 감사합니다! 현재 다음과 같이 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가 기본적으로 소수점 숫자라는 것을 알고 있지만 그것이 어떻게 작동하는지 확실하지 않습니다.

누구든지 전에 이것을 접한 사람이 있습니까?

건배, 숀.

도움이 되었습니까?

해결책

각각의 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는 범위에 있지 않으므로 실패합니다.

getter/setter가 내부적으로 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);
}

그렇게하면 확인이있을 때마다 IPS를 기간별로 분할 할 필요가 없습니다.

재미 (그리고 완전성의 유사성)를 위해서는 - 다른 방법으로는 명백한 방법은 문자열로 저장 될 때 IP 주소의 각 세그먼트에 대해 항상 3 자리를 사용하는 것입니다. 즉, 145.36.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/miscellyance/31036/

http://www.sqlservercentral.com/authors/scripts/kgayda/17134/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top