Question

D'accord, nous sommes vendredi après-midi et j'ai eu une longue semaine, j'apprécierais donc de l'aide! Actuellement, j'ai une liste de plages d'adresses IP, comme suit:

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

Après avoir obtenu l'adresse IP du client, si celle-ci se situe entre ces ensembles de plages, ils doivent être redirigés ailleurs.

Par exemple,

Si quelqu'un visitait le site avec l'adresse IP 192.168.0.1, il serait autorisé à y accéder. S'ils visitaient avec 145.36.1.0, l'accès ne leur serait pas autorisé car il se situe entre la première plage de cette liste.

Je pourrais diviser chaque adresse IP par la période et déterminer où la plage commence à changer, puis faire une comparaison, mais cela serait lourd pour le serveur.

Je sais que les adresses IP ne sont en fait que des nombres décimaux, mais je ne sais pas trop comment cela fonctionne.

Quelqu'un est-il déjà tombé sur cette image?

À la vôtre, Sean.

Était-ce utile?

La solution

Convertissez chaque adresse IP vers le numéro , puis vérifiez si l'adresse IP de l'utilisateur est comprise entre ces numéros.

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

Autres conseils

Je voudrais convertir les adresses IP en nombres 32 bits, puis effectuer un simple > = de et < = pour vérifier si elle est dans la plage.

Par exemple, 192.168.1.1 - > 192 * 256 ^ 3 + 168 * 256 ^ 2 + 1 * 256 + 1.

Travailler avec vos valeurs, 145.36.0.0 - > 2435055616 et 145.36.0.0 - & Gt; 2435121151. Donc 145.36.200.30 - & Gt; 2435106846, et tombe dans cette plage, il est donc valide. Mais 145.35.255.255 - & Gt; 2435055615 n'est pas dans la plage (à peine), donc il échoue.

J'écrirais ma classe IPRange de sorte que le getter / setters convertisse en interne la chaîne IP en un nombre:

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

Définirait en interne:

int from = 145036000000;
int to = 145036255255;

Ajoutez ensuite une méthode .IsInRange (string ip) qui convertit l’adresse IP entrante en nom de forme int et effectue une comparaison simple.

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

De cette façon, vous ne devez pas séparer les IP de la plage par périodes à chaque vérification.

Juste pour le plaisir (et un semblant d’exhaustivité) - l’autre façon évidente de faire est de vous assurer que vous utilisez toujours 3 chiffres pour chaque segment de l’adresse IP stockée sous forme de chaîne, c’est-à-dire 145.36.0.0 devrait être 145,036. 000.000 - Ainsi, les chaînes seraient directement comparables.

Et le moins évident serait d’avoir une classe d’adresses IP explicite et de définir votre propre logique de comparaison (j’assume de façon imprudente qu’il n’ya pas déjà quelque chose comme cela enfoui dans les profondeurs du framework .NET. ..)

J'ai lu à ce sujet il y a quelques jours.

Vous pouvez convertir et comparer vos plages d'adresses 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

Voici la fonction IPStringToNumber dont elle a besoin:

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

Références:

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

http://www.sqlservercentral.com/Authors/Scripts/kgayda/ 17134 /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top