Estudio

El fundamento de SQL injection

Estoy convencido de que si lo piensas detenidamente coincidirás conmigo en que, usualmente, la finalidad de nuestras aplicaciones es la de servir  a nuestros usuarios de interfaz para  el manejo de extensas bases de datos. Estas bases de datos están diseñadas para facilitar la consulta y el transporte de información hacia el usuario y, en sentido opuesto, para recibir y almacenar información entregada por el mismo. Cada vez que un usuario consulta o envía información a la base de datos de tu aplicación, está participando en la construcción de un código que ejecutará una acción en dicha base de datos. Ahora que hemos dicho esto, pregúntate ¿podría un usuario ilegítimo aprovechar esta pequeña participación para desvirtuar el código y hackear tu base de datos?.

Longitud y formato también importan

 Te cuento más cosas a tener en cuenta cuando procesas información recibida de tus usuarios. En primer lugar quiero que sepas que es conveniente que chequees la longitud de los valores recibidos para prevenir ataques de denegación de servicio o de desbordamiento de buffer. En PHP se puede usar la función strlen() para comprobar la longitud del dato recibido antes de procesarlo.

If (strlen($edad) > 3 ) exit ($edad . " es un valor inválido para el campo edad";)

 Y ahora hablemos del formato. Cuando comprobamos el tipo de variable y su longitud puede parecer que tenemos todo el trabajo hecho, pero no  es del todo cierto. Una fecha de nacimiento y un correo electrónico pueden estar contenidos en una variable del tipo cadena de caracteres, pero tienen aspectos bien distintos, formatos diferentes. La fecha puede estar separada por barras, usar dos caracteres para indicar el día en cifras, tres para indicar el mes en letras y dos para indicar el año en cifras; algo así como 12/jun/78. El correo electrónico contiene dos secciones bien diferencias por el signo @ y finaliza con un punto y una extensión del tipo com, es, tv, org, etc. Otro ejemplo: metroSetenta@gmail.com. En el momento en que nuestro código debe interactuar con el de otras aplicaciones como, por ejemplo, gestores de correos, bases de datos o sistemas subyacentes, el formato usado es esencial para la prevención de errores y brechas de seguridad.

Comprobar el tipo de datos recibidos

 Este es uno de esos pasos que ya te conté que tienes que dar para conseguir el correcto y seguro funcionamiento de tu aplicación. No es necesario tener un nivel de formación en informática a la altura de poder generar errores del tipo buffer overflow, porque si tu aplicación espera un valor numérico y un usuario maligno introduce texto, lo mejor que puede pasar es que tu programa no funcione correctamente. Se trata, pues, de una gran brecha potencial en la seguridad de tu aplicación. Los tipo de datos, a grandes rasgos se pueden dividir en tres: Cadenas de texto, números y booleanos.

Tu aplicación contra la gestión de variables inesperadas

 En entradas anteriores hice alusión al modo en el que un usuario ilegítimo de tu aplicación web puede hacer tentativas muy básicas de hacking del estilo que sigue:

http://servidor/aplicacion?administrador=TRUE

Seguro que esto te hace reflexionar sobre la importancia de no admitir y gestionar variables inesperadas, así que te muestro a continuación un pequeño código para excluir automáticamente valores inapropiados de tus scripts, pudiendo así asumir con certeza que el entorno global está saneado, incluso aunque el atacante remplace el código de tu web para enviar valores no esperados. La idea consiste en listar las variables esperadas por nuestro código en un array, y posteriormente usarlo para chequear las variables recibidas. ¡Es como una lista de invitados a una sala de fiestas pija!. Aunque este ejemplo está en PHP, como casi siempre, te recuerdo que la idea es fácilmente transportable a cualquier lenguaje de programación.