| Artículos | 01 FEB 2006

Formularios web seguros

Tags: Histórico
Gonzalo Alvarez.
La mayor parte de ataques web puede evitarse con una correcta validación de la entrada. Por desgracia, ya sea por falta de tiempo o por desidia, muchos desarrolladores no incorporan validación de entrada a las páginas que crean. Los nuevos controles de validación de .NET simplifican sobremanera la tarea de validar los datos recibidos de formularios. Añadiendo unas pocas líneas de código se pueden conseguir páginas blindadas ante ataques.

¿Dónde validar?
Nunca jamás deberíamos aceptar como legal un dato procedente de un usuario sin haberlo validado antes. Esta validación puede realizarse solamente en el servidor o en el servidor y también en el cliente. Por el contrario, nunca debería realizarse solamente en el cliente. En este último caso, un atacante podría desactivar la ejecución de scripts de su navegador (Herramientas » Preferencias » Características web para Firefox o Herramientas » Opciones de Internet » Seguridad » Nivel personalizado » Automatización » Secuencias de comandos ActiveX para Internet Explorer), por lo que todo código de validación de entrada quedaría automáticamente desactivado. Alternativamente, podría utilizar directamente la ventana de Dirección del navegador para escribir una URL cuidadosamente codificada para saltarse las protecciones o incluso solicitar las páginas desde una ventana de Telnet o a través de un proxy web.
Por consiguiente, no basta con validar la entrada en el cliente, también es necesario hacerlo en el servidor. Entonces, ¿por qué hacerlo en ambos sitios? La respuesta es evidentemente práctica: para ahorrar recursos del servidor y ancho de banda. Suponiendo que los errores en la entrada de datos se deban a omisiones o equivocaciones involuntarias de los usuarios, trasladando la validación al cliente se ahorran muchas transacciones entre navegador y servidor web, ya que el navegador será capaz de tratar con los errores y guiar al usuario para la correcta introducción de datos.
Contrariamente a lo que podemos ver en algunos códigos de validación, no basta con comprobar si los campos están vacíos, tienen la longitud adecuada (función a menudo abandonada a un simple atributo MAXLENGTH en un campo de entrada, muy fácil de modificar) y se corresponden con la sintaxis prevista (para teléfonos, códigos postales, números de NIF o CIF, etc.). También resulta importante verificar que no escondan ataques potenciales.
Con el fin de facilitar las tareas de validación de datos de entrada en páginas web, ASP.NET introduce varios controles de validación. Una ventaja adicional de estos controles es que generan código tanto para el cliente como para el servidor. Si un navegador soporta JavaScript, entonces automáticamente se le envía el código de validación de cliente. En caso contrario, las rutinas de validación sólo se ejecutan en el servidor.
Si por algún motivo se desea desactivar la validación en el extremo cliente, se puede incluir la siguiente directiva al comienzo de la página:
<%@ Page ClientTarget=”downlevel” %>
De forma alternativa, se pueden desactivar los controles individualmente estableciendo su propiedad EnableClientScript a False.

Requerir campos
Se utiliza el control RequireFieldValidator para comprobar si a otro control le ha sido asignado un valor. Generalmente se utiliza junto con los controles TextBox, aunque puede emplearse con cualquier otro.
Login:
<asp:TextBox
Id=”txtLogin”
Columns=”16”
MaxLength=”16”
Runat=”Server” />
<asp:RequiredFieldValidator
ControlToValidate=”txtLogin”
Text=”Error: Debe introducir un login”
ErrorMessage=”Login”
Display=”Dynamic”
Runat=”Server” />

Validación de expresiones regulares
El control RegularExpressionValidator sirve para verificar que el valor de un control se ajusta a una expresión regular.

Login:
<asp:TextBox
Id=”txtLogin”
Columns=”16”
MaxLength=”16”
Runat=”Server” />
<asp:RegularExpressionValidator
ControlToValidate=”txtLogin”
Text=”Error: sólo se permiten entre 4 y 16 caracteres alfanuméricos”
ErrorMessage=”Login”
ValidationExpression=”\w{4,16}”
Display=”Dynamic”
Runat=”Server” />

Las expresiones regulares son fórmulas que permiten ajustar cadenas de texto que sigan un patrón determinado. En el ejemplo que mostramos, la expresión regular \w{4,16} permite ajustar cualquier cadena que contenga entre 4 y 16 caracteres alfanuméricos; si el valor de txtLogin introducido por el usuario contiene caracteres no alfanuméricos o menos de 4 caracteres, o más de 16, sería rechazado. Su potencia es prácticamente ilimitada, ya que con expresiones relativamente sencillas se pueden ajustar cadenas muy complejas. Por ejemplo, una expresión regular para ajustar un número de teléfono sería \d{9}, mientras que para ajustar una dirección de correo se podría utilizar algo como ^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$.
Una regla muy importante a la hora de utilizar expresiones regulares como herramienta de validación de entrada es que resulta mucho más seguro especificar la lista de caracteres permitidos, lo que se conoce como white list (lista blanca), en lugar de intentar especificar la lista de caracteres prohibidos, lo que se conoce como black list (lista negra). El motivo es bien sencillo: si al intentar enumerar todos los caracteres peligrosos se omite alguno, un atacante podría dar con él y conseguir perpetrar el ataque; en cambio, si se define la lista de caracteres válidos y se olvida alguno, en el caso peor algún usuario no podrá utilizar algún carácter inocuo, pero no se producirá merma alguna de la seguridad.
Visual Studio .NET incluye varias expresiones regulares comunes para utilizar con este control. Desgraciadamente, para usuarios españoles resultan de limitada utilidad. En cualquier caso, lo mejor es que nosotros mismos creemos nuestras propias expresiones regulares.
La extensión RegExp Viewer para Firefox te ayudará a trabajar con expresiones regulares. Puedes instalarla desde addons.mozilla.org/extensions/moreinfo.php?id=1123.

Comparación de valores
El control CompareValidator compara el valor introducido en un control con otro valor, que puede ser fijo o bien el introducido en otro control del formulario. Resulta útil también para comprobar si los datos introducidos son de un cierto tipo. Por ejemplo, podemos utilizarlo para verificar que una contraseña introducida dos veces es idéntica en ambos casos.

Password:
<asp:TextBox
Id=”txtPassword”
Columns=”16”
MaxLength=”16”
TextMode=”Password”
Runat=”Server” />
Password (de nuevo):
<asp:TextBox
Id=”txtPassword2”
Columns=”16”
MaxLength=”12”
TextMode=”Password”
Runat=”Server” />
<asp:CompareValidator
ControlToValidate=”txtPassword2”
ControlToCompare=”txtPassword”
Text=”Error: La contraseña debe coincidir con la anterior”
ErrorMessage=”Password (de nuevo)”
Operator=”Equal”

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información