13 jun 2011

Evita SQL Injection con patrones de diseño como ActiveRecord

 

Buenas a todos, en el post de hoy me gustaría hablaros sobre los patrones de diseño, como por ejemplo ActiveRecord, el cual es un mecanismo de Mapeo Objeto-Relacional (Object Relational Mapping - ORM), que son utilizados para acceder a los datos de una base de datos desde código sin necesidad de utilizar SQL. En concreto hoy os hablaré sobre sus beneficios de cara a la seguridad.

En primer lugar, y aprovechando que no es un tema muy conocido, aprovecharemos para explicar que son.

Los patrones de diseño son una manera de acceder a las tablas de una base de datos sin la necesidad de escribir ningún tipo de código SQL. Para ello solo utilizaremos clases y objetos, como en POO, Las clases están muy cerca de la representación de los datos en la BBDD y representan las tablas, son conocidas como "Modelos" y un objeto representaría una fila de una de las tablas de la BBDD, y se encargaría de encapsular el acceso a la misma, extraer, modificar y borrar datos.

A continuación os muestro un ejemplo con una parte de código de Castle ActiveRecord para .Net para que os hagáis una idea del funcionamiento. En este caso extraeremos los valores de las columnas "identificadorUsuario" que es Primary Key y "nombreUsuario" de la tabla "USUARIOS":

Modelo:namespace DatosUsuario.Models{[ActiveRecord(Table = "USUARIOS")]public class Persona : ActiveRecordBase<Persona>{Private int _identificadorUsuario;[PrimaryKey]Public int identificadorUsuario{get{ return _identidicadorUsuario;}set{ _identificadorUsuario=value;}}Private int _nombreUsuario;[Property]Public string nombreUsuario{get{ return _nombreUsuario;}set{ _nombreUsuario=value;}}}}

 

Este sistema reduce el uso de SQL hasta en un 80%, ya que los patrones de diseño como ActiveRecord, internamente se encargan de convertir nuestras operaciones con las clases y objetos en código SQL. Esta conversión se realiza de manera segura sin vulnerabilidades de SQL Injection. Por lo que así, gracias a esta abstracción, no habrá posibilidad de que generemos querys inseguras.

Por ejemplo, si un usuario malicioso intentase inyectar un "drop database" en SQL Server, Castle Active Record (wrapper de NHibernate) lo convertiría a SQL de una manera parecida a la siguiente:

EXECUTE sp_executesql 'select * from USUARIOS where nombreUsuario = @nombreUsuario', '@nombreUsuario varchar(65)', @nombreUsuario = 'drop database PEPITO;---';

Es decir, se parametriza, así no se ejecuta la sentencia SQL como código y simplemente se interpreta la inyección de código como texto.

¿Os parecen interesantes estas utilidades para interactuar con la BBDD o sois de los que les gusta SQL "a pelo"?

 

saludos!

 

2 comentarios:

  1. [...] Juanan nos enseñaba un patrón de diseño para evitar SQL Injection, ActiveRecord. [...]

    ResponderEliminar
  2. Un patrón de diseño no es una forma de acceder a una base de datos... Es una solución a un problema recurrente a un problema de programación. Que el acceso a la base de datos sea un problema recurrente es otra cosa. Tengo entendido que la mayor utilidad de los ORM es para facilitar el mantenimiento del código, porque ayuda a no mezclar SQL con el resto que lo hace medio engorroso.

    ResponderEliminar