Usando declaraciones preparadas

Consultas a una base de datos PostgreSQL en Java

Miller Trujillo

Staff Software Engineer

El problema con las declaraciones

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
  • La inyección SQL ocurre cuando la entrada del usuario se inserta directamente en SQL
String title = "' OR 1 = 1 --";
  • Los atacantes pueden cambiar la lógica de la consulta
String query = "SELECT * FROM books WHERE title = '' OR 1 = 1 --'";

$$

  • La inyección SQL puede modificar nuestros datos 🚫
Consultas a una base de datos PostgreSQL en Java

Inyección SQL

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
title = "'; DELETE FROM books; --"
query = "SELECT * FROM books WHERE title = ''; DELETE FROM books; -- REST of query"
  • Todos los registros serán eliminados 🔄

$$

  • Limitar permisos ayuda, pero no es suficiente
  • Los atacantes aún pueden consultar datos sensibles
Consultas a una base de datos PostgreSQL en Java

Declaraciones preparadas

  • Declaración SQL precompilada que usa marcadores
String sql = "SELECT * FROM books WHERE title = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland");
ResultSet rs = pstmt.executeQuery();
  • Los parámetros se escapan y tratan como datos, nunca como SQL ejecutable 🔒
Consultas a una base de datos PostgreSQL en Java

Trabajando con múltiples parámetros

String sql = "SELECT * FROM books WHERE title = ? AND publication_year = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland"); pstmt.setInt(2, 1998);
ResultSet rs = pstmt.executeQuery();
  • Cada tipo de dato tiene su propio método setter
Consultas a una base de datos PostgreSQL en Java

¡Vamos a practicar!

Consultas a una base de datos PostgreSQL en Java

Preparing Video For Download...