C# – walidacja zakresu IPv4

C# – walidacja zakresu IPv4

Mając początkowy adres IPv4 i końcowy adres IPv4, skąd możesz wiedzieć, czy jest to prawidłowy zakres?

Zakres jest ważny, jeśli:

  • Początkowy adres IPv4 jest prawidłowy.
  • Końcowy adres IPv4 jest prawidłowy.
  • Zakres to sieć klasy C z maską podsieci 255.255.255.0. Oznacza to, że początkowy adres IP i końcowy adres IP dzielą pierwsze trzy oktety. Uwaga:to było moje wymaganie, kiedy musiałem to rozwiązać. Jeśli Twój zakres to klasa B lub A, odpowiednio dostosuj kod.
  • Początkowy adres IPv4 występuje przed końcowym adresem IPv4.

Na przykład:

Given startingIP=127.0.0.1
Given endingIP=127.0.0.10

startingIP is valid
and
endingIP is valid
and 
startingIP first 3 octets (127.0.0) == endingIP first 3 octets (127.0.0)
and
startingIP last octet (1) < endingIP last octet (10)
 Code language: plaintext (plaintext)

Ten artykuł pokaże kod, który implementuje tę logikę walidacji.

Kod i testy weryfikacyjne zakresu IPv4

W przypadku pierwszych dwóch warunków – początkowego i końcowego adresu IP są prawidłowe adresy IPv4 – użyjemy wbudowanego System.Net.IPAddress.TryParse().

W przypadku dwóch ostatnich warunków będziemy porównywać oktety (adres IPv4 jest wyrażony w notacji dziesiętnej z kropkami, tj. 127.0.0.1, gdzie każda kropka oddziela oktet). Aby sprawdzić, czy początkowy i końcowy adres IP znajdują się w tej samej sieci klasy C (podsieć 255.255.255.0), porównamy pierwsze trzy oktety. Następnie upewnimy się, że początkowy adres IP znajduje się przed końcowym adresem IP, porównując czwarty oktet.

using System.Net;

public static class IPv4Util
{
	public static bool IsRangeValid(string ipRangeStart, string ipRangeEnd)
	{

		if (!TryParseIPv4(ipRangeStart, out IPAddress start)
			||
			!TryParseIPv4(ipRangeEnd, out IPAddress end))
		{
			return false;
		}

		byte[] startBytes = start.GetAddressBytes();
		byte[] endBytes = end.GetAddressBytes();

		return startBytes[0] == endBytes[0]
			&& startBytes[1] == endBytes[1]
			&& startBytes[2] == endBytes[2]
			&& startBytes[3] < endBytes[3];

	}
	private static bool TryParseIPv4(string ipString, out IPAddress ipAddress)
	{
		return IPAddress.TryParse(ipString, out ipAddress) && 
			ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork;

	}
}
Code language: C# (cs)

Poniższy sparametryzowany test jednostkowy udowadnia logikę walidacji, testując pięć przypadków testowych.

[DataRow("256.0.0.1", "256.0.0.2", false)]
[DataRow("127.0.0.", "127.0.0.2", false)]
[DataRow("127.0.1.10", "127.0.0.20", false)]
[DataRow("127.0.0.20", "127.0.0.10", false)]
[DataRow("127.0.0.10", "127.0.0.20", true)]
[DataTestMethod()]
public void IsRangeValidTest(string ipRangeStart, string ipRangeEnd, bool shouldBeValid)
{
	//arrange and act
	var isValid = IPv4Util.IsRangeValid(ipRangeStart, ipRangeEnd);

	//assert
	Assert.AreEqual(shouldBeValid, isValid);
}
Code language: C# (cs)