Utiliser les instructions préparées

Interroger une base de données PostgreSQL en Java

Miller Trujillo

Staff Software Engineer

Le problème avec les Statements

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
  • L'injection SQL survient quand une saisie usager est insérée directement dans le SQL
String title = "' OR 1 = 1 --";
  • Les attaquants peuvent modifier la logique de la requête
String query = "SELECT * FROM books WHERE title = '' OR 1 = 1 --'";

$$

  • L'injection SQL peut modifier nos données 🚫
Interroger une base de données PostgreSQL en Java

Injection 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"
  • Tous les enregistrements seront supprimés 🔄

$$

  • Limiter les permissions aide, mais ne suffit pas
  • Les attaquants peuvent quand même interroger des données sensibles
Interroger une base de données PostgreSQL en Java

Instructions préparées

  • Instruction SQL précompilée avec des paramètres de substitution
String sql = "SELECT * FROM books WHERE title = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland");
ResultSet rs = pstmt.executeQuery();
  • Les paramètres sont échappés et traités comme des données, jamais comme du SQL exécutable 🔒
Interroger une base de données PostgreSQL en Java

Gérer plusieurs paramètres

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();
  • Chaque type de donnée a sa propre méthode setter
Interroger une base de données PostgreSQL en Java

Passons à la pratique !

Interroger une base de données PostgreSQL en Java

Preparing Video For Download...