Usando Prepared Statements

Consultando um banco de dados PostgreSQL em Java

Miller Trujillo

Staff Software Engineer

O problema com Statements

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
  • Injeção de SQL ocorre quando a entrada do usuário é inserida diretamente no SQL
String title = "' OR 1 = 1 --";
  • Atacantes podem alterar a lógica da consulta
String query = "SELECT * FROM books WHERE title = '' OR 1 = 1 --'";

$$

  • Injeção de SQL pode modificar nossos dados 🚫
Consultando um banco de dados PostgreSQL em Java

Injeção de 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 os registros serão deletados 🔄

$$

  • Limitar permissões ajuda, mas não é suficiente
  • Atacantes ainda podem consultar dados sensíveis
Consultando um banco de dados PostgreSQL em Java

Prepared Statements

  • Declaração SQL pré-compilada que usa placeholders
String sql = "SELECT * FROM books WHERE title = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland");
ResultSet rs = pstmt.executeQuery();
  • Parâmetros são escapados e tratados como dados, nunca como SQL executável 🔒
Consultando um banco de dados PostgreSQL em Java

Trabalhando com múltiplos 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 dado tem seu próprio método setter
Consultando um banco de dados PostgreSQL em Java

Vamos praticar!

Consultando um banco de dados PostgreSQL em Java

Preparing Video For Download...