Hoy voy a hablar de un cambio introducido en el framework hace ya algunos años, que, al menos en mi caso, pasó totalmente desapercibido en su momento y durante bastante tiempo después. Y he pensado que sería buena idea publicar sobre ello porque, como este mundo es así de grande, seguro que hay todavía algún despistado al que podría estar afectando a día de hoy y ni siquiera se ha dado cuenta :)
Como recordaréis, los atributos de validación [EmailAddress]
y [Url]
, presentes en el espacio de nombres System.ComponentModel.DataAnnotations
, los hemos utilizado durante años para asegurar que determinados valores de entrada eran direcciones de correo electrónico y URLs válidas, respectivamente:
public class Blog
{
[Required, EmailAddress]
public string ContactEmail { get; set; }
[Required, Url]
public string Url { get; set; }
}
Desde el principio de los tiempos, aún en ASP.NET "clásico", ambos atributos de validación utilizaban internamente complejas expresiones regulares para comprobar los valores, y la verdad es que funcionaban relativamente bien. Nuestras aplicaciones podían confiar en que valores que hubieran superado dichas validaciones serían, como mínimo, sintácticamente correctos y buenos candidatos a ser direcciones de correo o URLs válidas.
Pues bien, desde la llegada de NET 4.7.2, y luego en .NET Core, [EmailAddress]
y [Url]
ya no funcionan así. En palabras casi textuales del equipo de desarrollo, el objeto de estos dos atributos es simplemente prevenir algunos errores básicos al teclear, y no contemplar todas las posibilidades definidas en las respectivas RFC que describen la sintaxis de dichos valores.
Así pues, desde .NET 4.7.2 y en .NET Core, el comportamiento estándar es:
-
[EmailAddress]
dará por válido cualquier valor que sea nulo o contenga un único carácter arroba "@" en una posición que no sea la primera ni la última. Eso es todo :-/ Por ejemplo, la validación podrá ser superada por valores como "hola@hola" o "_@!". -
[Url]
considerará correctos los valores que sean nulos o simplemente comiencen por "http://", "https://" o "ftp://". Por ejemplo, serán valores válidos "https://esto no es una url" o simplemente "http://".
En resumen, si tenéis aplicaciones donde usáis estos atributos para validar los datos de entrada, y en vuestro contexto es importante que éstos sean totalmente correctos, deberíais revisarlas:
-
En .NET 4.7.2 y superiores, es posible volver al comportamiento anterior (es decir, a que se utilice internamente la expresión regular) estableciendo el valor del configuración "DisableRegEx" a
false
en el archivo de configuración.<appSettings> <add key="dataAnnotations:dataTypeAttribute:disableRegEx" value="false"/> </appSettings>
Aunque ojo, porque esto podría hacer al sistema vulnerable a ataques de denegación de servicio, que fue el motivo por lo que se introdujo este cambio.
-
En .NET Core, tendréis que implementar por vuestra cuenta la lógica extra para validarlos de forma apropiada, ya sea mediante expresiones regulares o bien por otros medios.
En fin, son cosas de la evolución que a veces se nos pasan por alto, pero que debemos prestarles atención en algún momento.
Publicado en Variable not found.
Aún no hay comentarios, ¡sé el primero!
Enviar un nuevo comentario