SQL Injection y Consultas Parametrizadas (2/4)

Para eliminar el problema de la inyección de SQL a nivel de JDBC debemos de hacer uso de consultas parametrizadas .Estas consultas no concatenan las variables a la consulta SQL sino que usan una sintaxis especifica para pasar a la consulta SQL un conjunto de parámetros predeterminado. Vamos a ver a continuación una parte del código del post anterior modificado.

Connection conexion = null;
 PreparedStatement sentencia = null;
 ResultSet rs = null;
 boolean valido = false;
 try {
 Class.forName("com.mysql.jdbc.Driver");
 conexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/arquitecturajava","root","blog");
 String consulta = "select nombre from Usuarios where nombre =? and clave =?";
 sentencia = conexion.prepareStatement(consulta);
 sentencia.setString(1, nombre);
 sentencia.setString(2, clave);
 rs = sentencia.executeQuery();
 if (rs.next())
 valido = true;

Como podemos ver la consulta se construye de otra forma utilizando el carácter de interrogación “?” para definir la posición de cada uno de los parámetros.
String consulta = “select nombre from Usuarios where nombre =? and clave =?”;

El valor de los parámetros será pasado mas adelante  a traves del siguiente bloque de código

 sentencia = conexion.prepareStatement(consulta);
 sentencia.setString(1, nombre);
 sentencia.setString(2, clave);

De esta forma la consulta es primero precompilada para mas adelante recibir los valores de los parámetros pero sin posibilidad de que la consulta (tablas ,indices y joins) sea modificada. Asi pues si intentamos  ejecutar otra vez el programa MAIN intentando inyectar SQL como se muestra a continuación.

boolean valido = validarUsuario(“usuario1”, “‘ or 0=0#”);

if (valido) {

System.out.println(“el acceso es correcto”);

}

Simplemente no recibiremos ningún resultado ya que no hay ningún usuario con la clave =”or 0=0″ y el ResultSet de retorno vendra vacío.De esta manera hemos evitado injección de SQL utilizando consultas parametrizadas.