2010-12-14 55 views
2

Nous écrivons une fonctionnalité qui permet à un administrateur de bloquer/autoriser des plages d'adresses IP.La manière la plus simple de vérifier l'adresse IP par rapport à une plage de valeurs à l'aide de C#

Est-ce assez facile à faire avec C#? Je pensais à regarder chaque nombre [ici]. [Ici]. [Ici]. [Ici] et puis l'accoler avec les plages et juste voir si chaque nombre était entre les deux?

Cela fonctionnera-t-il pour les adresses ip v4 standard?

+0

Comment définissez-vous une plage d'adresses IP? – CodesInChaos

+0

+1 question très intéressante! curieux cependant ... autorisez-vous l'expression de plages à l'aide d'une norme telle que la notation CIDR? –

Répondre

3

Je les convertirais en entiers, puis comparerais l'entier. Mais ce qui est correct dépend de la façon dont vous définissez les plages.

UInt32 Ip4ToInt(string ip) 
{ 
    UInt32[] parts=ip.Split('.').Select(s=>UInt32.Parse(s)).ToArray(); 
    if (parts.Length != 4) 
    throw new ArgumentException("InvalidIP"); 
    return (parts[0]<<24) | (parts[1]<<16) | (parts[2]<<8) | parts[3]; 
} 

Par exemple devrait 1.1.1.99 faire partie de la gamme 1.1.1.1 - 1.1.2.2? Quand on compare chaque groupe, ce n'est pas le cas lorsqu'on compare les entiers.

0
public static bool CheckIfIpValid(string allowedStartIp, string allowedEndIp, string ip) 
     { 
      // if both start and end ip's are null, every user with these credential can log in, no ip restriction needed. 

     if (string.IsNullOrEmpty(allowedStartIp) && string.IsNullOrEmpty(allowedEndIp)) 
      return true; 
     bool isStartNull = string.IsNullOrEmpty(allowedStartIp), 
      isEndNull = string.IsNullOrEmpty(allowedEndIp); 
     string[] startIpBlocks, endIpBlocks, userIp = ip.Split('.'); 
     if (!string.IsNullOrEmpty(allowedStartIp)) 
      startIpBlocks = allowedStartIp.Split('.'); 
     else 
      startIpBlocks = "0.0.0.0".Split('.'); 
     if (!string.IsNullOrEmpty(allowedEndIp)) 
      endIpBlocks = allowedEndIp.Split('.'); 
     else 
      endIpBlocks = "999.999.999.999".Split('.'); 

     for (int i = 0; i < userIp.Length; i++) 
     { 
      // if current block is smaller than allowed minimum, ip is not valid. 
      if (Convert.ToInt32(userIp[i]) < Convert.ToInt32(startIpBlocks[i])) 
       return false; 
      // if current block is greater than allowed maximum, ip is not valid. 
      else if (Convert.ToInt32(userIp[i]) > Convert.ToInt32(endIpBlocks[i])) 
       return false; 
      // if current block is greater than allowed minimum, ip is valid. 
      else if ((Convert.ToInt32(userIp[i]) > Convert.ToInt32(startIpBlocks[i])) && !isStartNull) 
       return true; 

     } 
     return true; 
    } 
1

Je sais que System.Net.IPAddress.Address est dépréciée Mais je pense que cela est la meilleure façon:

bool result = false; 

System.Net.IPAddress iStart = System.Net.IPAddress.Parse(ipStart); 
System.Net.IPAddress iEnd = System.Net.IPAddress.Parse(ipEnd); 
System.Net.IPAddress iIp = System.Net.IPAddress.Parse(ip); 

if (iStart.Address <= iIp.Address && iEnd.Address >= iIp.Address) 
{ 
    result = true; 
} 

ps. ipStart, ipEnd, ip sont des chaînes. Exemple: 127.0.0.1