WebSec Java SQL-Injection 1
WebSec Java SQL-Injection 1
Tema:
Web Security.
SQL Injection en Java.
Objetivo.
Disear una aplicacin Java que permita obtener seguridad contra la Inyeccin SQL en una base de datos.
Parte I.
Disear una base de datos con Java utilizando el siguiente ejemplo. En este caso se utiliza Access.
Parte II.
Cambiar el ejemplo anterior para utilizar MySQL.
Parte III.
La solucin a SQL Injection es utilizar PreparedStatement en lugar de Statement de Java.
El enunciado PreparedStatement representa una declaracin SQL precompilada que se puede ejecutar varias veces
sin tener que recompilarla en cada ejecucin.
a. El siguiente cdigo es seguro contra una inyeccin SQL, ya que utiliza correctamente las consultas utilizando
parmetros. Con el uso de la clase PreparedStatement se enlazan variables (con los signos de interrogacin)
y los mtodos setString correspondientes, por lo que la inyeccin SQL se puede evitar. Un caso seguro contra
la SQL Injection es el siguiente ejemplo:
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE userid=? AND password=?");
stmt.setString(1, userid);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
b. Sin embargo, el siguiente caso pudiera ser vulnerable a un ataque. Este cdigo es factible a que sea vulnerable a la
inyeccin SQL, ya que utiliza consultas dinmicas para concatenar los datos maliciosos para la propia consulta.
Se debe observar que se utiliza la clase Statement en lugar de la clase PreparedStatement.
String query = "SELECT * FROM users WHERE userid ='"+ userid + "'" + " AND password='" + password + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
Web Security
Pgina 1
c. El siguiente cdigo tambin es vulnerable a SQL Injection. A pesar de que la clase PreparedStatement
todava est creando la consulta de forma dinmica a travs de la concatenacin de cadenas.
String query = "SELECT * FROM users WHERE userid ='"+ userid + "'" + " AND password='" + password + "'";
PreparedStatement stmt = connection.prepareStatement(query);
ResultSet rs = stmt.executeQuery();
EJERCICIO.
Utilizando el cdigo inicial, realizar los cambios pertinentes para mostrar la forma en que el uso de la clase
PreparedStatement puede evitar el ataque contra la SQL Injection. Explicar en cada caso a, b y c, la justificacin
del uso de PreparedStatement.
Web Security
Pgina 2