Consulta preparada

Post date: Apr 7, 2012 10:21:31 AM

Una consulta preparada (también llamada una consulta parametrizada) es una consulta SQL en la que algunos elementos son abstraídos y pueden pasarse como parámetros cuando la consulta sea ejecutada. Las consultas preparadas son fáciles de escribir y son más fáciles de entender que cuando se intenta construir dinámicamente una consulta concatenando texto SQL con variables. Al pasar una consulta preparada al manejador de bases de datos este prepara el plan de ejecución y lo almacena para utilizarlo cada vez que la consulta preparada es ejecutada.

Los mecanismos que manejan las consultas preparadas en los lenguajes de programación generalmente incluyen lo necesario para tratar adecuadamente los parámetros, en particular realizan la transformación de textos a un formato que pueda ser utilizado en una consulta.

Desde el punto de vista de seguridad, el uso de consultas preparadas puede evitar ataques del tipo Inyección SQL. Aseguran que un potencial atacante no pueda desviar la consulta pasando parámetros que modifican su intención original.

El siguiente código en Java utiliza una consulta preparada.

String cliente = request.getParameter("nombreCliente"); // Esta entrada debería validarse. //realizar validación de entradas para evitar este tipo de taques. String consulta = "SELECT balance_cuenta FROM user_data WHERE nombre = ? "; PreparedStatement pstmt = connection.prepareStatement( consulta ); pstmt.setString( 1, cliente); ResultSet results = pstmt.executeQuery( );

En Visual Basic, el código es muy similar y debe estar rodeado por un bloque try-catch.

Try Dim command As SqlCommand = new SqlCommand("sp_getAccountBalance", connection) command.CommandType = CommandType.StoredProcedure command.Parameters.Add(new SqlParameter("@cliente", CustomerName.Text)) Dim reader As SqlDataReader = command.ExecuteReader() ' … Catch se As SqlException ‘ error handling End Try

Herramientas de intermediación como Hibernate, cuando son mal utilizadas, pueden igualmente sufrir de ataques de inyección; estos ataques pueden ser evitados mediante la utilización de consultas preparadas:

//Forma no segura de construir consultas con Hibernate Query consultaPeligrosa = session.createQuery( "from Inventario where IdProducto = '" + parameroPasadoPorElUsuario + "'"); //Forma segura de realizar la misma consulta Query consultaSegura = session.createQuery( "from Inventario where IdProducto = :idProducto"); consultaSegura.setParameter("idProducto", parameroPasadoPorElUsuario);

Otros lenguajes incluyen también las primitivas necesarias para realizar consultas preparadas.

En una aplicación en donde todas las consultas son preparadas se puede restringir el uso de consultas dinámicas en la base de datos, y así evitar intentos de ataque basados en la construcción dinámica de consultas. En PHP se utiliza la librería PDO con consultas parametrizadas fuertemente tipificadas. Las librerías de Hibernate para Java y de NHibernate para la plataforma .NET se utiliza el método createQuery()para crear una consulta preparada. SQLite utiliza sqlite3_prepare() para crear objetos consulta.

Enlaces relacionados

Cursos relacionados