Inyección de SQL

La vulnerabilidad más importante y que menos se tiene en cuenta a la hora de trabajar con bases de datos, es la inyección de sentencias SQL.

Una inyección de SQL se da cuando se inserta una sentencia de SQL dentro de otra sentencia SQL, esta invasión, logra alterar el funcionamiento normal y permite la ejecución de código malintencionado.

Este problema no puede considerarse como un problema de seguridad informática, es un problema derivado del programador, es un error de programación. Generalmente la falta e conocimientos, ignorancia sobre problemáticas de SQL o un simple descuido, dejarán una aplicación abierta a la entrada de código malicioso. El error se debe a la inexistencia de validación de los datos que han entrado desde una aplicación.

A continuación con un sencillo ejemplo, veremos en qué consiste la Inyección de SQL.

Supongamos que tenemos un portal de empleados en nuestra intranet (aplicación web) con una casilla donde el empleado debe poner su correspondiente código.

El uso normal de cualquier usuario bienintencionado es poner su código y su clave, para entrar en su sesión para realizar el trabajo diario. El de un usuario mal intencionado, con conocimientos de informática y habiendo detectado que es posible ejecutar código inyectado, podrá ser bien distinto.

Internamente el programa informático realiza una consulta similar a esta:

1
SELECT * FROM Empleados WHERE Codigo_Empleado = [Valor de la Casilla]

Cuando nuestro programa no está preparado para evitar código inyectado, el usuario malintencionado podría añadir en la casilla el siguiente valor:

1
[Valor de la Casilla]; DROP TABLE Empleados;

Donde [Valor de la Casilla] seguiría siendo algo que espera el programa original, pero no lo que viene a continuación del “;”. En este caso habríamos borrado todos los datos de inicio de sesión de usuarios y sería imposible que en esa empresa algún trabajador desarrollar su labor diaria.

Como evitarlo en PHP:

Dependiendo del motor de base de datos que estemos usando, deberemos ir a la documentación para implementar esta protección. En el caso de MySQL, debemos usar la unción mysql_real_escape_string.

1
2
3
4
5
6
$query_result = mysql_query
(
  "SELECT * FROM EMPLEADOS WHERE CodigoEmpleado = \""
  mysql_real_escape_string($codigo_empleado)
  "\""
);

Como evitarlo en VISUAL STUDIO .NET (VB.NET):

En este lenguaje y derivados de la plataforma .NET, dependiendo del método de trabajo que usemos, podemos independizarnos del sistema gestor de bases de datos, es decir, es el lenguaje el encargado de validar las sentencias.

1
2
3
4
5
6
7
8
'// Creamos una consulta
Dim cmd As New SqlCommand( _
  "SELECT * FROM EMPLEADOS " & _
  "WHERE CodigoEmpleado = @CodigoEmpleado", cnn)
'// Abrimos la conexión
cnn.Open()
'// Añadimos el valor del parámetro de la consulta
cmd.Parameters.AddWithValue("@CodigoEmpleado", txtCodigoEmpleado.Text)

Como evitarlo en:

Tags: , , , , , , ,

No comments yet.

Deja un comentario