Tips para evitar SQL Injection

En un gran porcentaje, la mayoría de nuestras aplicaciones necesitan acceder a las bases de datos para realizar consultas, actualizaciones e incluso eliminaciones de nuestros registros… El problema es cuando alguien desde fuera intenta hacer esas tareas por nosotros 😉

Voy a proponeros algunos tips  a la hora de tratar los valores ajenos a nosotros desde el lado del servidor, para evitar este tipo de catástrofes. Por otro lado, cualquier tip adicional será bienvenido 😀

Convierte siempre el valor a su tipo correspondiente

Si por ejemplo estamos esperando un valor de tipo numérico, deberíamos intentar parsear este valor a dicho tipo para asegurarnos de que no incluye texto adicional:

var id = Request.QueryString["id"];

int result;

if (Int32.TryParse(id, out result))
    //Do things

Parametrizar las consultas SQL

Un error muy común es hacer uso de los valores que nos llegan sin especificar ningún tipo para el mismo. Algo parecido a esto:

var id = Request.QueryString["id"];
var query = "SELECT * FROM HOUSES WHERE ID=" + id;

Para evitarlo, podemos parametrizar las sentencias SQL y poder especificar de esta manera el tipo que estamos esperando para cada parámetro.

var objConnection = new OleDbConnection(strDbConnectionString);

objConnection.Open();

const string query = "SELECT * FROM HOUSES WHERE ID=?";

var objCommand = new OleDbCommand(query, objConnection);
var id = new OleDbParameter("@idParam", OleDbType.Integer) { Value = id};
objCommand.Parameters.Add(id);

var objReader = objCommand.ExecuteReader();;

Usar una cuenta con permisos restringidos a la base de datos

Otro dato importante a tener muy en cuenta es asegurarnos de que la cuenta de usuario utilizada por nuestra aplicación tiene los permisos necesarios para poder acceder y/o modificar unos datos concretos pero también que sea lo suficiente restrictiva para no alterar otro tipo de datos.

No mostrar al usuario la información de error generada por la base de datos

En muchos casos los mensajes de error pueden ser lo suficientemente descriptivos como para que el usuario se percate de información acerca de la estructura de la base de datos.

Rechazar las peticiones con caractéres sospechosos

Carácter especialSignificado SQL
;Delimitador de consultas.
Carácter delimitador de cadena de datos.
Comentario.
/* */Delimitadores de comentario. El texto entre /* y */ no es evaluado.
xp_Se utiliza en el inicio del nombre de procedimientos almacenados extendidos de catálogo, como xp_cmdshell.

Espero que sea de utilidad 🙂

¡Saludos!