miércoles, 3 de noviembre de 2010

Inyección de SQL

Este es un tema muy delicado que requiere ser reconocido dentro del desarrollo de aplicaciones de cualquier tipo, se trata de un tema de seguridad muy importante y complejo es importante que lo conozcas y tengas en cuenta durante el desarrollo y mantenimiento de algún sistema del tipo que fuera.

La inyección de código SQL es un problema debido a que por lo general los sistemas  en alguna capa de su desarrollo necesitan de parámetros que deberán ser proporcionados por los usuarios finales para desplegar la información que estos necesitan, esta es una puerta abierta entre el los usuarios y el corazón del sistema.

La vulnerabilidad está en que en alguna de las capas del sistema todo desarrollador necesitara armar las instrucciones SQL necesarias para que el sistema responda a las necesidades del usuario esta parte es critica por que en el armado de las instrucciones puede haber sido enviada valores que no necesariamente sean los esperados por la aplicación.

En necesario crear rutinas de validación para verificar que los valores entrantes están entre los rangos o son del tipo esperado para evitar que de alguna manera sea posible corromper el funcionamiento de una aplicación.

Hablando de desarrollo web tenemos muchas formas útiles de prevenir estas situaciones, trataremos las más comunes a continuación.

Empezando desde la URL de las aplicaciones, en estos momentos es muy común el utilizar las llamadas URLs amigables para hacer más fácil y amigable la url para los visitantes y buscadores, Estas URLs necesitan ser validadas por expresiones regulares para determinar el inicio y fin de cada uno de los parámetros involucrados en la URL, son estas expresiones regulares las que nos serán de gran ayuda para realizar la primera limpieza de los parámetros y ahí eliminar todas las URLs que no cumplan con el tipo de dato esperado, es por eso que debemos aumentar a lo más posible las restricciones de las expresiones regulares y así evitar que se ingrese un valor no esperado en las URLs.

En el caso de los formularios los cuales son la principal herramienta de trabajo de las aplicaciones con la base de datos, es muy conveniente que realice una primera validación de los datos del lado del cliente utilizando javascript al igual podemos apoyarnos de expresiones regulares para evitar que sea introducidos datos incorrectos que puedan afectar a nuestra base de datos.

Una buena medida es la del envió por  correo electrónico de los errores causados durante la ejecución, esta medida ayudara mucho a identificar en caso de que ocurra un problema, el motivo que lo origino, reparar y reconocer si existen otros lugares dentro de la aplicación que pudieran provocar un error similar.

En el lado del servidor es donde los datos involucrados se vuelven críticos y es ahí donde no debemos confiarnos de que la información pasada por el navegador del cliente es segura, por el contrario hay que tomar en cuenta que hasta ese momento se trataba de una parte no controlada al 100% por la aplicación, debemos tomar todas las medidas precautorias para garantizar que los datos pasados sean los esperados.

Es por eso que debes limpiar cada uno de los parámetros utilizados por la aplicación de posibles valores que sean perjudiciales y en caso de que el parámetro no sea del tipo esperado es importante devolver una excepción al nivel anterior.

Una regla es que siempre que un dato sea usado para interactuar con la base de datos en alguna instrucción SQL ese dato debe ser validado sin excepción alguna.

¿Has tenido una experiencia de este tipo?

jueves, 22 de julio de 2010

MySQL y Tipos Numéricos

Si estas teniendo problemas con campos de tipo numérico al realizar consultas, existe la posibilidad de que el tipo de campo que estas utilizando no sea el adecuado para lo que pretendes almacenar en el, es importante saber y comprender las características que hacen diferente a un tipo de valor de otro, con esto ahorraremos tiempo y no tendremos sorpresas en los resultados de las consultas.

La sugerencia es analizar los posibles usos para el cual será utilizado el valor que pretendemos almacenar.


INT, INTEGER, SMALLINT deben ser utilizados para los valores exactos como pueden ser “número de hijos”, “numero de recamaras”, “id_registro” por citar algunos ejemplos.

FLOAT, REAL, DOUBLE PRECISION, almacenan valores aproximados en decimales, redondean su valor al ser almacenados, es importante hacer notar que aunque almacenes un valor absoluto (6.0, 100.0) estos formatos de numero almacenan en la base de datos números adicionales en los decimales por lo que el valor 100.0 puede ser almacenado como 100.000000000045 debido a que son números aproximados. Estos tipos de datos pueden ser utilizados para guardar resultados de operaciones como pueden ser el “raiz_cuadrada”, “coseno”, “integral”.

Es muy común obtener resultados no deseados por el uso incorrecto de estos tipos de valores, cuando estamos buscando por rangos de valores excluyentes de los límites.


DECIMAL, DEC almacenan números enteros y de coma flotante exactos, no redondean su valor se almacenan tal cual como hayan sido proporcionados, es utilizados para guardar cantidades exactas de coma flotante. Algunos ejemplos de su uso pueden ser “salario”, “IVA”, “ISR”.

Espero les sirvan estas observaciones, aunque un tanto básicas en apariencia, aunque yo pienso que son de esos detalles que a veces omitimos durante el diseño de nuestras bases de datos.