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.

martes, 10 de febrero de 2009

Codificación Unicode UTF-8

Quiero platicarles acerca de un detalle que toda persona que se dedique a desarrollar aplicaciones Web debe tener muy en cuenta, esto debido a que existen aun muchas personas que lo pasan por alto, esto es la codificación de caracteres en el que vamos a desarrollar nuestra aplicación.

Actualmente debemos desarrollar todas nuestras aplicaciones utilizando el sistema de codificación utf-8, utilizarlo significa que debemos de guardar todos los archivos de texto utilizando un editor que este configurado previamente para guardar los documentos en esta codificación. Hay que tener en cuenta que implementar la codificación no es simplemente agregar un encabezado al header, este solo le indica al navegador en que tipo de codificación esta guardado el archivo, por lo que no necesariamente lo implementa si ya lo comprendimos en este punto.

El sistema de codificaciones es mas que una etiqueta, es el modo y espacio que cada uno de los caracteres ocupara en la memoria del disco, con las etiquetas le indicamos a los navegadores en que sistema de codificación esta guardado y por lo tanto como debe de interpretar lo almacenado en el.

Para que nuestro sistema integre al 100% la codificación debemos guardar todos nuestros archivos .aspx, asp, .js, .css, cs, vb, .php, .jsp, etc, Utilizando la codificación.
Si usamos una base de datos de igual manera debeos almacenar la información en esta codificación por lo que debemos establecerle la estructura de la base de datos para que almacene la información utilizando la codificación de caracteres a utf-8.

Si seguimos estas recomendaciones en el momento de iniciar el desarrollo ya habremos establecido las bases para desarrollar una aplicación en la que no debemos preocuparnos por estar convirtiendo información de una a otra codificación.

¿Qué problemas has tenido con las codificaciones de caracteres?

sábado, 17 de enero de 2009

Semana Tequilera

El sabado 24 de enero del 2009 se realizara una reunion del movimiento TequilaValley en merida. el objetivo de la reunion es la convivencia y comparticion de opiniones entre la comunidad de desarrolladores, diseñadores y todos los que estamos involucrados en internet en cualquiera de sus formas.

Les extiendo la invitacion para participar con nosotros en el starbucks de circuito a partir de las 10 de la mañana el organizador es @RoverWire.

jueves, 15 de enero de 2009

Componentes en Javascript

Un recurso poco utilizado a veces desconocido por los desarrolladores es la posibilidad de construir clases en javascript, este es un recurso que de dominarlo nos habre muchas posibilidades debido a que nos proporciona una forma de encapsular la logica de una aplicacion de internet en una clase la cual puede ser instanciada y asu vez facilita la reutilizacion de codigo.

Aunque parezca increible todo en javascript son objetos, desde los tipos de datos, hasta las mismas funciones. Aunque no es muy facil comprender al lenguaje en este aspecto debido a que la sintaxis y la forma como javascript lo implementa es diferente de como estamos acostumbrados, lo que en un principio puede confundirnos.

Para iniciarnos en el tema podemos crear un ejemplo sencillo el cual se refiere a un objeto llamado ferrari, el cual es un vehiculo que tiene propiedades tales como el color, asientos, etc; asi como metodos como pueden ser arranque, apagado, desplazamiento;

var ferrari = new Object({
color : "Rojo",
asientos : 2,
arranque : function(){
alert("Hola Michael!!");
alert("brum, brum");
},
desplazamiento: function(){
alert("Ruuuunnnn");
},
apagar : function(){
alert("Adios Michael!!");
}
});


En el ejemplo estamos creando un objeto instanciandolo de la clase Object la cual les parecera conocida a muchos, de esta manera estamos agregandole a nuestro objeto propiedades y metodos los cuales seran los que utilizemos en el entorno del sistema.

La manera de acceder a las propiedades de nuestro objeto es llamando a nuestro objeto seguido de un punto y a continuacion el nombre de nuestra propiedad y/o evento.


ferrari.color = "Verde";

ferrari.
arranque(); // Hola Michael!!
ferrari.
desplazamiento(); // Nos movemos
ferrari.
apagar(); // Nos hemos detenido

De esta manera JavaScript no da la oportunidad de que podamos crear todo tipo de componentes, encapsulando toda su funcionalidad en clases los cuales nos permiten reutilizarlos en nuestros proyectos de manera sencilla. con los cual no deberiamos de por que sufrir creando funciones y mas funciones independientes que en nada ayudan a la ingenieria de software y que a su vez complican demaciado los futuros mantenimientos asi como la escalabilidad de nuestras aplicaciones.

domingo, 4 de enero de 2009

Referencia Cultural en ASP.NET

Hola de nuevo, yo creo que alguna vez se habran encontrado desarrollando un proyecto en su servidor local y cuando terminan y colocan su proyecto y su base de datos en el servidor final se habran encontrado con el problema de que los formatos de fechas y numeros es diferente de los formatos para los cuales esta desarrollado su proyecto y sobre todo para los clientes a los cuales esta dirijido su sitio.

Esto resulta un verdadero problema por lo que debemos hacer conversiones de formatos para presentarle a los usuarios de nuestros sistemas los datos correctamente.

Para este tipo de problema asp.net incorpora una utilidad la cual realmente facilita enormemente el proceso de presentacion de datos, de una manera muy sencilla, la manera correcta de enfrentar este tipo de situaciones es agregando la referencia de cultura de la interfaz de usuario en el archivo web.config, indicando el tipo de cultura para el cual deben de presentarse los datos, la sintaxis es la siguiente:



Si lo que deseamos es agregar la referencia de cultura en una sola pagina debemos realizarlo modificando la directiva @ Page agregando los atributos Culture y UICulture:



De esta manera no debemos de precuparnos mas por las conversiones entre el cliente y el servidor de sql ya que la referencia cultural sincronizara de modo automatico los formatos entre el cliente y el servidor de bases de datos. presentandole en los formatos correctos los datos a los usuarios y a su vez el desarrollador no tiene por que realizar conversiones de formatos.

martes, 30 de diciembre de 2008

Nuevo Blog de ASP.NET

Hola compañeros, bienvenidos a este su blog, en el me gustaria conocer a todo tipo de personas a los cuales les guste como a mi el desarrollo de internet y el aprendizaje de todas aquellas tecnologias involucradas en el,he aprendido y desarrollado conocimientos que me gustaria compartir con ustedes, para de esta manera contribuir a la mejora continua, sirvance luego a colaborar conmigo para hacer de este blog una fuente de conocimientos.

Saludos!!