Utilisation des instructions préparées

Interroger une base de données PostgreSQL en Java

Miller Trujillo

Staff Software Engineer

Le problème avec les instructions

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
  • L'injection SQL se produit lorsque l'entrée utilisateur est directement intégrée dans 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 n'est pas suffisant
  • Les attaquants peuvent toujours interroger des données sensibles
Interroger une base de données PostgreSQL en Java

Instructions préparées

  • Instruction SQL précompilée utilisant des paramètres
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

Travailler avec 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ées a sa propre méthode de définition
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...