Saltar al contenido

¿Cuál es la mejor manera de validar una dirección IP?

Luego de mucho luchar ya hallamos la contestación de esta pregunta que tantos lectores de nuestro sitio han tenido. Si deseas aportar algún dato no dejes de dejar tu información.

Solución:

los limitación con IPAddress.TryParse método es que verifica si un string podría convertirse a una dirección IP, por lo tanto, si se suministra con un string valor como "5"lo considera como "0.0.0.5".

Otro enfoque para validar un IPv4 podría ser el siguiente:

public bool ValidateIPv4(string ipString)

    if (String.IsNullOrWhiteSpace(ipString))
    
        return false;
    

    string[] splitValues = ipString.Split('.');
    if (splitValues.Length != 4)
    
        return false;
    

    byte tempForParsing;

    return splitValues.All(r => byte.TryParse(r, out tempForParsing));

Se podría probar como:

List ipAddresses = new List

    "2",
    "1.2.3",
    "1.2.3.4",
    "255.256.267.300",
    "127.0.0.1",
;
foreach (var ip in ipAddresses)

    Console.WriteLine($"ip ==> ValidateIPv4(ip)");

La salida será:

2 ==> False
1.2.3 ==> False
1.2.3.4 ==> True
255.256.267.300 ==> False
127.0.0.1 ==> True

También puedes usar IPAddress.TryParse pero tiene limitaciones y podría resultar en un análisis incorrecto.

Método System.Net.IPAddress.TryParse

Tenga en cuenta que TryParse devuelve true si analizó la entrada con éxito, pero eso no significa necesariamente que la dirección IP resultante sea válida. No utilice este método para validar direcciones IP.

Pero esto funcionaría con normal string que contenga al menos tres puntos. Algo como:

string addrString = "192.168.0.1";
IPAddress address;
if (IPAddress.TryParse(addrString, out address)) 
       //Valid IP, with address containing the IP
 else 
       //Invalid IP

Con IPAddress.TryParse puede verificar la existencia de tres puntos y luego llamar TryParse me gusta:

public static bool ValidateIPv4(string ipString)

    if (ipString.Count(c => c == '.') != 3) return false;
    IPAddress address;
    return IPAddress.TryParse(ipString, out address);

using System.Net;
public static bool CheckIPValid(string strIP)

    IPAddress result = null;
    return
        !String.IsNullOrEmpty(strIP) &&
        IPAddress.TryParse(strIP, out result);

y tu estas listo

Editar 1

Se agregaron algunas comprobaciones adicionales para evitar que se generen excepciones (que son costosas). PD: no manejará Unicode.

Editar 2

@StephenMurby IPAddress.TryParse regresará true si analizó con éxito el string. Si revisa la documentación del método, generará una excepción en dos casos.

  1. los string es null.
  2. los string contiene caracteres Unicode.

Depende de usted decidir (decisión de diseño) si desea lanzar excepciones o regresar false. Cuando se trata de analizar, generalmente prefiero regresar false en lugar de excepciones (suponiendo que esta es una entrada que no se garantiza que sea correcta).

Desglosando la declaración de devolución, estoy diciendo,

  1. los string no es null (ni vacío que no analizará de todos modos) Y
  2. La dirección IP se analiza correctamente.

Recuerde que las expresiones booleanas de C# se evalúan de forma diferida, por lo que CLR ni siquiera intentará analizar el string si esto es null o vacío.

Sobre el si faltante, puedes hacer algo como,

if (IP.TryParse(strIP, out result)

    return true;

Pero todo lo que realmente haces es decir si algo es trueregreso true. Es más fácil simplemente devolver la expresión de inmediato.

La mejor solución Regex (útil para MVC DataAnnotations):

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).)3(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

C#

Regex.IsMatch(value, "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)3(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")

Eres capaz de apoyar nuestro ensayo escribiendo un comentario o valorándolo te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *