21 nov 2012

Protegiendo inyecciones de código SQL en PHP, J2EE y .Net

Buenas a todos, en el post de hoy volvemos a hablar de las inyecciones de código SQL, en este caso para brindaros algunos trucos para filtrarlas y proteger vuestros aplicativos en función del lenguaje que utilicéis en vuestros desarrollos.

En primer lugar hay que tener en cuenta algunos conceptos clave para poder protegernos de este tipo de inyecciones:

  • Siempre que sea posible deberemos parametrizar las consultas
  • Nunca utilizar en las aplicaciones usuarios con privilegios de administración. Siempre deberán utilizarse usuarios que tengan los permisos mínimos para ejecutar las tareas para las que fue diseñada la aplicación
  • Utilizar mensajes de error personalizados, evitando mostrar información del fabricante del software, versión, etc.
  • Siempre hay que validar los datos de entrada, independientemente de que su explotación no nos produzca ningún perjuicio, ya que podrían utilizarse de trampolín para atacar a otros sistemas

Aclaradas algunas claves, a continuación os mostraremos 3 ejemplos para los lenguajes/frameworks más comunmente utilizados, PHP, J2EE y .Net.

PHP

En el caso de PHP puede ser interesante hacer uso de PHP Data Objects (PDO) y las consultas parametrizadas (bindParam())

A continuación se presenta un ejemplo de sentencia SQL que devuelve los usuarios de la tabla TablaUsuarios cuyo valor de la columna Nombre coincide con el texto "Flu":

$sql= ‘SELECT * FROM TablaUsuarios WHERE Nombre= :name’;$query= $conn->prepare($sql);$query->bindParam(‘:name’, ‘Flu’);$query->execute();

J2EE

De la misma manera que con el anterior ejemplo en PHP haremos uso de las consultas parametrizadas, en este caso gracias a “PreparedStatement”.

Ahora recuperaremos los usuarios de la TablaUsuarios cuyo identificador de usuario sea "5":

ps = c.prepareStatement("SELECT * FROM TablaUsuarios WHERE idUsuario=?”);ps.setInt(1, 5);ResultSet rs = ps.executeQuery();

.NET

Finalmente mostraremos un ejemplo práctico para parametrizar consultas en .Net haciendo uso de “SQLCommand”.

Al igual que en el anterior ejemplo recuperaremos los usuarios de la TablaUsuarios cuyo identificador de usuario sea "5":

SqlCommand q= new SqlCommand(‘SELECT * FROM TablaUsuarios WHERE idUsuario=@id’, conexion);q.Parameters.AddWithValue("@id", 5);r = q.ExecuteReader();

Eso es todo por hoy, proximamente seguiremos mostrando ejemplos sobre como aplacar este tipo de inyecciones.

Saludos!

1 comentario: