Archive | Desarrollo RSS feed for this section

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:

Desarrollo y Diseño

Voy a sacar una serie de artículos introductorios sobre las tecnologías de desarrollo y de diseño que utilizo actualmente.

En los artículos abordaré de forma muy superficial los aspectos técnicos, sólo pretendo mostrar con unas pinceladas el motivo por el cual las uso e intentaré ilustrarlo con algún ejemplo real.

Estos son algunos de los temas que voy a tratar:

  • jQuery, el alma de la parte de cliente en las aplicaciones web.
  • Microformat, la web semántica.
  • CSS 3 y HTML 5, mejoras y novedades.
  • Evitar inyección en consultas SQL para PHP y .NET.
  • Creación de formularios con Adobe PDF.
  • Control de versiones con Subversion para Dreamweaver.

Otras tecnologías, aun siendo la base, como: PHP, MySQL, Microsoft Visual Studio .Net, Adobe Photoshop, Adobe Dreaweaver, etc. querrán relegados a pequeños artículos sobre aspectos puntuales de los mismos.

En unos dias “jQuery, el alma de la parte de cliente en las aplicaciones web“.