Frage

Ok, es ist Freitagnachmittag und ich hatte eine lange Woche, würde mich also um Hilfe freuen! Derzeit habe ich eine Liste von IP -Bereichen wie folgt:

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" });

Nachdem er die IP des Clients erhalten hat, müssen sie an anderer Stelle umgeleitet werden, wenn er zwischen diesen Reichweite zwischen diesen Sätzen liegt.

Zum Beispiel,

Wenn jemand die Website mit der IP besucht hat 192.168.0.1, Sie würden Zugang zugelassen. Wenn sie besucht haben 145.36.1.0, Sie würden keinen Zugriff haben, da er zwischen dem ersten Bereich in dieser Liste liegt.

Ich könnte jede IP in diesem Zeitraum teilen und herausfinden, wo sich der Bereich ändert, und dann einen Vergleich durchführen, aber das wäre stark auf dem Server.

Ich weiß, dass IPs im Grunde nur Dezimalzahlen sind, bin mir aber nicht sicher, wie das funktioniert.

Ist schon jemand darauf gestoßen?

Prost, Sean.

War es hilfreich?

Lösung

Konvertieren Sie jede IP-Adressierung zu zahlen, und prüfen Sie dann, ob sich die IP -Adresse der Benutzer zwischen diesen Zahlen befindet.

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;
    }
}

Andere Tipps

Ich würde die IP-Adressen in 32-Bit-Nummern umwandeln und dann ein einfaches> = aus und <= prüfen, ob es sich im Bereich befindet.

Zum Beispiel 192.168.1.1 -> 192 * 256^3 + 168 * 256^2 + 1 * 256 + 1.

Arbeiten Sie mit Ihren Werten 145.36.0.0 -> 2435055616 und 145.36.0.0 -> 2435121151. So 145.36.200.30 -> 2435106846 und fällt in diesen Bereich, sodass es gültig ist. Aber 145.35.255.255 -> 2435055615 liegt nicht im Bereich (gerade kaum), also scheitert es.

Ich würde meine iPrange -Klasse schreiben, damit die Getter/Setter die IP -Zeichenfolge intern in eine Nummer konvertieren:

new IPRange { From = "145.36.0.0", To = "145.36.255.255" }

Würde intern gesetzt:

int from = 145036000000;
int to = 145036255255;

Fügen Sie dann eine. IsInrange (String IP) -Methode hinzu, die das eingehende IP in das Namen int -Form umwandelt und einen einfachen Vergleich durchführt.

public bool IsInRange(string ipStr)
{
    int ip = ConvertIPStringToInt(ipStr);
    return (from <= ip && ip <= to);
}

Auf diese Weise müssen Sie die IPs nicht jedes Mal nach Perioden in den Bereich teilen, wenn er überprüft wird.

Nur zum Spaß (und zu einem gewissen Anschein der Vollständigkeit) - auf die andere Weise offensichtlich, kann man sicherstellen, dass Sie für jedes Segment der IP -Adresse immer 3 Ziffern verwenden, wenn Sie als Zeichenfolge speichern, dh 145.36.0.0 sollte 145.036.000.000 sein - Wie die Saiten direkt vergleichbar wären.

Und das weniger offensichtliche wäre es, eine explizite IP -Adressklasse und eine Rolle Ihrer eigenen Vergleichslogik zu haben (ich gehe davon aus, dass es in den Tiefen des .NET -Frameworks nicht bereits so etwas gibt ...)

Ich habe vor ein paar Tagen darüber gelesen.

Sie können Ihre IP -Bereiche konvertieren und vergleichen.

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

Hier ist die Ipstringtonumber -Funktion, die sie benötigt:

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

Verweise:

http://www.sqlservercentral.com/scripts/miscellaneous/31036/

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top