Año 7 • No. 273 • julio 2 de 2007 Xalapa • Veracruz • México
Publicación Semanal


 Centrales

 General


 Reportaje

 Regiones

 Becas y  oportunidades

 
Arte

 Deportes


 Contraportada


 Números  Anteriores


 Créditos

 

Tecno Tips
Proteger las aplicaciones de SQL Injection
(Parte 2)

Guillermo Humberto Vera Amaro
gvera@uv.mx

En la entrega anterior observamos cómo se pueden realizar ataques de inyección de código SQL, que es la ejecución de comandos en la base de datos por usuarios malintencionados. Pero, ¿cómo se pueden evitar estos ataques?

Como se mencionó, todo tiene que ver con malas prácticas de programación. Éstas son las recomendaciones:

Restringir y sanear los datos de entrada. Para comprobar los datos que se sabe que son buenos, hay que validar el tipo, la longitud, el formato y el intervalo. Nunca se debe confiar en que el usuario será bueno y no intentará ataques.

Utilizar parámetros SQL de tipo seguro para el acceso a los datos. Puede utilizar estos parámetros con procedimientos almacenados o cadenas de comandos SQL construidas dinámicamente. Las colecciones de parámetros como ofrecen la comprobación del tipo y la validación de la longitud. Si se utiliza una colección de parámetros, los datos de entrada se tratan como un valor literal y SQL Server no los trata como código ejecutable. Otra ventaja del uso de colecciones de parámetros es que se pueden realizar comprobaciones de tipo y de longitud. Los valores no comprendidos en el intervalo generan una excepción. Éste es un buen ejemplo de defensa en profundidad.

Por ejemplo, una instrucción de búsqueda quedaría así:

SelectCommand.Text = “SELECT isbn,nombre,editorial,edición FROM [libros] WHERE isbn=@isbnParam”

Aquí se añade el parámetro

SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);

Se le pone el valor ingresado por el usuario

SelectCommand.Parameters["@au_id"].Value = txtBusca.Text;

Utilizar una cuenta que disponga de permisos restringidos en la base de datos. Lo ideal sería conceder permisos de ejecución sólo a procedimientos almacenados seleccionados de la base de datos y no ofrecer acceso directo a tablas.

Evitar que se revele información de errores de la base de datos. En caso de que se produzcan errores en la base de datos, asegúrese de que no se revelen al usuario mensajes de error detallados.

Nota: Las medidas de seguridad convencionales, como el uso de Secure Socket Layer (SSL) e IP Security (IPSec), no protegen a la aplicación de ataques de inyección SQL.