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.
Hola he buscado las partes 3 y 4 pero no los encuentro. Podrías ayudarme para ver el contenido?
ya casi no me acuerdo , he encontrado esto https://www.arquitecturajava.com/consultas-parametrizadas-y-rendimiento/?preview_id=609&preview_nonce=de19b5b2dc&preview=true