管理者がIPアドレスの範囲をブロック/許可できるようにする機能を記述しています。cを使って値の範囲に対してIPアドレスをチェックする最も簡単な方法#
これはC#で行うのに簡単ですか?
[ここに] [ここに]各番号を見て、それを範囲と数え、それぞれの数字が2つの間にあるかどうかを見てみようと考えていましたか?
標準のip v4アドレスで動作しますか?
管理者がIPアドレスの範囲をブロック/許可できるようにする機能を記述しています。cを使って値の範囲に対してIPアドレスをチェックする最も簡単な方法#
これはC#で行うのに簡単ですか?
[ここに] [ここに]各番号を見て、それを範囲と数え、それぞれの数字が2つの間にあるかどうかを見てみようと考えていましたか?
標準のip v4アドレスで動作しますか?
私はそれらを整数に変換して整数を比較します。しかし、正しいことは範囲の定義方法によって異なります。例えば
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.99
1.1.1.1 - 1.1.2.2
範囲の一部である必要がありますか?各グループを比較するときはそうではありませんが、整数を比較するときはそうです。
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;
}
私は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
どのようにIPの範囲を定義しますか? – CodesInChaos
+1非常に興味深い質問!あなたはCIDR表記のような標準を使って範囲を表現できるようにしていますか? –