Buscar en ELMED

jueves, 4 de octubre de 2012

Evitar Inyecciones SQL en java


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));
}

No hay comentarios:

Publicar un comentario