0% encontró este documento útil (0 votos)
2 vistas1 página

Insert,: 5.1. Acceso A SQL Desde Lenguajes de Programación

El documento describe el uso de sentencias preparadas en SQL para evitar problemas de inyección SQL y mejorar la seguridad al manejar entradas de usuario. Se enfatiza que las sentencias preparadas permiten la ejecución eficiente de consultas y protegen contra errores de sintaxis al insertar caracteres especiales. Además, se menciona que el uso de concatenación de cadenas para crear consultas puede resultar en vulnerabilidades de seguridad significativas.

Cargado por

Santiago Cuervo
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
2 vistas1 página

Insert,: 5.1. Acceso A SQL Desde Lenguajes de Programación

El documento describe el uso de sentencias preparadas en SQL para evitar problemas de inyección SQL y mejorar la seguridad al manejar entradas de usuario. Se enfatiza que las sentencias preparadas permiten la ejecución eficiente de consultas y protegen contra errores de sintaxis al insertar caracteres especiales. Además, se menciona que el uso de concatenación de cadenas para crear consultas puede resultar en vulnerabilidades de seguridad significativas.

Cargado por

Santiago Cuervo
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 1

5.1.

Acceso a SQL desde lenguajes de programación 73

Pero antes de poder llamarlos se deben utilizar métodos de la clase sentencia preparada podría evitar este problema, ya que la cadena
PreparedStatement para asignar los valores a los parámetros «?». de entrada tendría caracteres de escape insertados, por lo que la
El método setString y otros métodos similares, como setInt para consulta se convertiría en:
otros tipos básicos de SQL, permiten especificar los valores de los
“select * from profesor where nombre = ´X\´ or \´Y\´= \´Y´
parámetros. El primer argumento especifica el parámetro «?» para
el que se asigna un valor (el primer parámetro es el 1, al contrario que no es peligrosa y devuelve una relación vacía.
que en otras construcciones de Java que empiezan por el 0). El se- Los sistemas antiguos permiten ejecutar varias sentencias en
gundo argumento especifica el valor a asignar. una única llamada, con sentencias separadas por punto y coma.
En el ejemplo de la figura, se prepara una sentencia insert, se Esta característica se está eliminando debido a la técnica de inyec-
establecen los parámetros «?» y después se invoca a executeUpda- ción SQL utilizada por hackers maliciosos para insertar sentencias
te. Las dos líneas finales del ejemplo muestran que los parámetros de SQL completas. Como estas sentencias se ejecutan en Java con
se mantienen hasta que no se modifiquen explícitamente. Por tan- los privilegios del propietario del programa, se podrían ejecutar
to, la sentencia final, que invoca a executeUpdate, inserta la tupla sentencias SQL devastadoras, como drop table. Los desarrollado-
(«88878», «Perry», «Finanzas», 125000). res de aplicaciones en SQL necesitan ser conscientes de estos po-
Las sentencias preparadas permiten una ejecución más eficien- tenciales agujeros de seguridad.
te en aquellos casos en que la misma consulta se puede compilar
una vez y ejecutar después muchas veces con diferentes valores de
los parámetros. Sin embargo, existe una ventaja más significativa public static void JDBCejemplo(String usuarioid, String contraseña)
de las sentencias preparadas que las convierte en el método prefe- {
rido para la ejecución de consultas de SQL siempre que se utilicen try
valores introducidos por los usuarios, incluso aunque la consulta se {
ejecute una sola vez. Suponga que se lee un valor que introduce un Class.forName (“oracle.jdbc.driver.OracleDriver”);
usuario y después se manipula una cadena de caracteres de Java Connection conn = DriverManager.getConnection(
para construir una sentencia de SQL. Si el usuario introduce ciertos “jdbc:oracle:thin:@db.yale.edu:1521:univdb”,
caracteres especiales, como una comilla simple, el resultado de la usuarioid, contraseña);
sentencia puede ser sintácticamente incorrecto a no ser que se ten- Statement stmt = conn.createStatement();
ga un extraordinario cuidado en la comprobación de la entrada. El try {
método setString lo hace automáticamente e inserta los caracteres stmt.executeUpdate(
de escape necesarios para asegurar la corrección sintáctica. “insert into profesor values(´77987´, ´Kim´,
En el ejemplo, suponga que el valor de las variables ID, nombre, ´Física´, 98000)”);
nombre_dept y sueldo los ha introducido el usuario y hay que in- } catch (SQLException sqle)
sertar la fila correspondiente en la relación profesor. Suponga que, {
en lugar de utilizar una sentencia preparada, se crea una consulta System.out.println(“No se pudo insertar la tupla. “ + sqle);
mediante la concatenación de las cadenas de caracteres utilizando }
la expresión de Java: ResultSet rset = stmt.executeQuery(
“insert into profesor values(´ “ + ID +” ´,´”+ nombre + “ ´,”+ “select nombre_dept, avg (sueldo) “+
“´+ nombre_dept + “ ´, “ ´ sueldo + “)” “ from profesor “+
“ group by nombre_dept “);
y la consulta se ejecuta directamente usando el método execute- while (rset.next()) {
Query de un objeto Statement. Ahora, si el usuario escribiera una System.out.println(rset.getString(“nombre_dept “) +
comilla simple en el campo ID o en el del nombre, la cadena de ca- ” ”+ rset.getFloat(2));
racteres de la consulta tendría un error de sintaxis. Es posible que }
algún nombre de profesor tenga un apóstrofo (especialmente si es stmt.close();
un nombre irlandés, como O´Donnell). conn.close();
Aunque la situación anterior puede considerarse problemáti- }
ca, puede ser aún peor. Se puede utilizar una técnica denominada catch (Exception sqle)
inyección SQL propia de hackers maliciosos para robar datos o {
crear daños en la base de datos. System.out.println(“Excepción : “ + sqle);
Suponga que un programa Java recibe un string nombre y cons- }
truye la consulta: }
“select * from profesor where nombre = ´” + nombre + “´”
Figura 5.1. Ejemplo de código de JDBC.
Si el usuario en lugar de escribir un nombre escribe:
X´ or ´Y´ = ´Y PreparedStatement pStmt = conn.prepareStatement(
“insert into profesor values(?,?,?,?)”);
entonces la sentencia resultado se convierte en: pStmt.setString(1, “88877”);
“select * from profesor where nombre = ´” + “X´ or ´Y´ = ´Y” + “´” pStmt.setString(2, “Perry”);
pStmt.setString(3, “Finanzas”);
que es: pStmt.setInt(4, 125000);
select * from profesor where nombre = ´X´ or ´Y´ = ´Y´ pStmt.executeUpdate();
pStmt.setString(1, “88878”);
En la consulta resultado, la cláusula where es siempre cierta pStmt.executeUpdate();
y se devuelve la relación profesor completa. Usuarios maliciosos
más inteligentes pueden conseguir incluso más datos. El uso de una Figura 5.2. Sentencias preparadas en el código JDBC.

También podría gustarte