0% encontró este documento útil (0 votos)
76 vistas

WebSec Java SQL-Injection 1

Este documento describe cómo diseñar una aplicación Java segura contra la inyección SQL mediante el uso de la clase PreparedStatement. Explica cómo crear una base de datos en Java y MySQL y luego cambia el código para utilizar PreparedStatement en lugar de Statement, vinculando variables con signos de interrogación y métodos set para evitar la inyección SQL. También analiza tres ejemplos y explica por qué el primero es seguro mientras que los otros dos son vulnerables.

Cargado por

Salo Ventura
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
76 vistas

WebSec Java SQL-Injection 1

Este documento describe cómo diseñar una aplicación Java segura contra la inyección SQL mediante el uso de la clase PreparedStatement. Explica cómo crear una base de datos en Java y MySQL y luego cambia el código para utilizar PreparedStatement en lugar de Statement, vinculando variables con signos de interrogación y métodos set para evitar la inyección SQL. También analiza tres ejemplos y explica por qué el primero es seguro mientras que los otros dos son vulnerables.

Cargado por

Salo Ventura
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 2

Materia:

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.

import java.sql.*; // DBMS


public class DBMSbasico{
String
db
= "Dbms1.mdb";
final String CONTROLADOR
= "sun.jdbc.odbc.JdbcOdbcDriver"; //Dbms1.mdb";
final String URL_BASEDATOS
= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)}; DBQ=" + db;
Connection conexion
= null; // maneja la conexin
Statement
instruccion
= null;
// instruccin de consulta
ResultSet
conjuntoResultados = null;
// maneja los resultados
public DBMSbasico(){
try{
Class.forName( CONTROLADOR );
conexion
= DriverManager.getConnection(URL_BASEDATOS, "", "");
instruccin
= conexion.createStatement();
conjuntoResultados = instruccion.executeQuery("SELECT Id, Nombre, Apellido, Frecuencia FROM T1" );
ResultSetMetaData metaDatos = conjuntoResultados.getMetaData();
int numeroDeColumnas
= metaDatos.getColumnCount();
while ( conjuntoResultados.next() ){
for ( int i = 1; i <= numeroDeColumnas; i++ )
System.out.printf( "%-8s\t", conjuntoResultados.getObject( i ) );
System.out.println();
} // fin de while
}
catch ( SQLException excepcionSql ){ excepcionSql.printStackTrace();}
catch ( ClassNotFoundException noEncontroClase ){ noEncontroClase.printStackTrace(); }
finally{
// asegura que conjuntoResultados, instruccion y conexion estn cerrados
try{ conjuntoResultados.close(); instruccion.close(); conexion.close(); }
catch ( Exception excepcion ){ excepcion.printStackTrace(); }
}
// fin de finally
}
// fin de inicio
public static void main( String args[] ){
new DBMSbasico();
}
}

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

También podría gustarte