La última versión de ASP.NET, la 4.0, incorpora varias opciones de configuración que tienen que ver con las URLs de nuestras páginas. Por ejemplo: los caracteres que son válidos y, por lo tanto, admitidos en una URL.

Por defecto existen 8 caracteres especiales que no se admiten en la ruta de una página, a saber:

<
>
&
*
%
:
\
?

La verdad es que es bastante lógico, puesto que no puede existir ningún archivo ni carpeta que los use en su nombre, y además el "et" o "ampersand" (&) y la interrogación (?) forman parte siempre de la parte de parámetros o "Query String" de una URL, no de la ruta.

Cuando se introduce uno de estos caracteres en una URL, ASP.NET devuelve un error 400, de petición errónea:

En ASP.NET 4.0 es posible definir la lista de caracteres no válidos en una URL tocando el web.config de la aplicación, en concreto el nodo httpRuntime en su propiedad requestPathInvalidChars:

<httpRuntime requestPathInvalidChars="&lt;,&gt;,*,%,&amp;,:,\,?"  />

Este es su valor por defecto que como vemos incluye los 8 caracteres que comentaba antes.

Si quisiésemos añadir algunos caracteres más que consideremos que no debemos admitir por seguridad, bastaría con incorporarlos a la lista anterior redefiniendo este nodo dentro de web.config.

Además, hay una serie de caracteres no imprimibles que si se intentaran utilizar producirían el mismo efecto, y no hay forma de quitarlos de la lista. Se trata de todos los caracteres ASCII que están entre el 0 y el 31 (el 32 es el primer caracter imprimible y es es el espacio en blanco). Estos caracteres son siempre no válidos por la misma definición de lo que es una URL, y es el propio sistema operativo a través del módulo http.sys quien se encarga de rechazar esas URLs (ni siquiera llega a .NET).

>> Longitud de las URL

Otro parámetro que ha sido constante hasta ahora en el mundo .NET es la longitud máxima de una ruta de nuestra aplicación: 260 caracteres. El motivo es que esta es la longitud máxima que se admite en el sistema de archivos NTFS, que al final es donde residen los archivos de nuestra aplicación.

Otro límite habitual ha sido el de la longitud máxima de la Query String (lo que va después de la ? en una URL, que define los parámetros de la petición). En ASP.NET el límite ha sido siempre de 2.048 caracteres. De hecho este límite debería ser más que suficiente, aunque la mayor parte de los navegadores lo superan: Internet Explorer soporta "sólo" 2.083 caracteres que ya es superior, pero otros navegadores como Opera (4.050 caracteres), Firefox (8.182 caracteres) o safari (8.184 caracteres) soportan como vemos muchos más.

A veces será útil modificar el límite autoimpuesto por ASP.NET de 2.048 caracteres. La mayor parte de las veces mi consejo sería reducir esta longitud ya que si tienes que enviar realmente tanta información mejor que uses un POST y no un GET, y si permites tamaños muy grandes se podrían utilizar para intentar saturar el servidor o hacer que falle tu aplicación si no se espera algo tan grande y trata de ahcer alguna conversión de datos, por ejemplo.

Tocando el mismo nodo de web.config que en el caso anterior puedes modificar ambos límites en ASP.NET 4.0:

<httpRuntime maxRequestPathLength="260" maxQueryStringLength="2048" />

El primer parámetro permite definir longitudes de ruta más largas o más cortas (se refiere a la parte de la URL que no es ni el  http://, ni el nombre del servidor, ni el QueryString). El segundo parámetro modifica la longitud permitida en el Query String.

>> Conclusión
Aunque generalmente no necesitarás tocar ninguno de estos parámetros es bueno saber que ahora puedes hacerlo si surge la necesidad. En cualquier caso es raro que una aplicación llegue a necesitar alcanzar esos límites de tamaño en las rutas, por lo que puede ser interesante cambiarlas por defecto para que sean más cortas y disminuir así la superficie de ataque por esta vía.

No te olvides tampoco de que estas limitaciones afectan tanto a peticiones "normales" desde el navegador, como a peticiones Ajax que no ves porque se hacen en segundo plano.

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA