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. |