2010-12-14 6 views
2

管理者がIPアドレスの範囲をブロック/許可できるようにする機能を記述しています。cを使って値の範囲に対してIPアドレスをチェックする最も簡単な方法#

これはC#で行うのに簡単ですか?

[ここに] [ここに]各番号を見て、それを範囲と数え、それぞれの数字が2つの間にあるかどうかを見てみようと考えていましたか?

標準のip v4アドレスで動作しますか?

+0

どのようにIPの範囲を定義しますか? – CodesInChaos

+0

+1非常に興味深い質問!あなたはCIDR表記のような標準を使って範囲を表現できるようにしていますか? –

答えて

3

私はそれらを整数に変換して整数を比較します。しかし、正しいことは範囲の定義方法によって異なります。例えば

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

1.1.1.991.1.1.1 - 1.1.2.2範囲の一部である必要がありますか?各グループを比較するときはそうではありませんが、整数を比較するときはそうです。

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

私はSystem.Net.IPAddress.Address を非推奨であることを知っているしかし、私はこれが最も簡単な方法であると思う:

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は文字列です。例:127.0.0.1

関連する問題