Ya habiendo explicado lo importante que es evitar inyecciones SQL
en este post,
ahora veremos la forma más elegante de evitarlas desde el lenguaje
de programación Java. Para ello haremos uso de los PreparedStatement
los cuales pertenecen al paquete java.sql y nos permiten construir una
sentencia SQL precompilada, lo que nos hará ganar tiempo a la hora de
ejecutar la sentencia y nos ayudara a evitar inyecciones SQL.
En este ejemplo
veremos una inyección SQL común la cual no
se efectúa gracias a los PreparedStatement y a si
nos quitamos el engorroso trabajo de validar las cadenas que
se envían a una consulta.
//Obtengo un estamento de una conexion hecha Statement estamento = conexion.createStatement(); //Creo una tabla de prueba estamento.execute("Create Table usuarios(id varchar(20),nombre varchar(100),contrasena varchar(20));"); //Inserto datos de prueba //Este es un insert de una sola line para mysql estamento.execute("Insert into usuarios(id,nombre,contrasena) Values('1','LBVP','LBVP'),('3','juan','juan'),('4','ana','ana')"); //Creo la sentencia SQl precompilada PreparedStatement pstmt = conexion.prepareStatement("SELECT * FROM usuarios WHERE nombre = ? AND contrasena=?"); //Relleno el parametro 1 pstmt.setString(1, "LBVP"); //Relleno el parametro 2 pstmt.setString(2, "' or 1=1--"); //Obtengo el resultado de la consulta ResultSet rs = pstmt.executeQuery(); //Si encuentra algo imprime el primer campo de los registro while (rs.next()) { System.out.println(rs.getString(1)); }