Використання Prepared Statements

Запити до бази даних PostgreSQL у Java

Miller Trujillo

Staff Software Engineer

Проблема зі Statements

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
  • SQL-інʼєкція стається, коли введення користувача вставляють прямо в SQL
String title = "' OR 1 = 1 --";
  • Зловмисники можуть змінити логіку запиту
String query = "SELECT * FROM books WHERE title = '' OR 1 = 1 --'";

$$

  • SQL-інʼєкція може змінювати наші дані 🚫
Запити до бази даних PostgreSQL у Java

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"
  • Усі записи буде видалено 🔄

$$

  • Обмеження прав допомагає, але цього недостатньо
  • Зловмисники все ще можуть витягати чутливі дані
Запити до бази даних PostgreSQL у Java

Prepared Statements

  • Попередньо скомпільований SQL-запит із плейсгоулдерами
String sql = "SELECT * FROM books WHERE title = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland");
ResultSet rs = pstmt.executeQuery();
  • Параметри екрануються і трактуються як дані, ніколи як виконуваний SQL 🔒
Запити до бази даних PostgreSQL у Java

Робота з кількома параметрами

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();
  • Кожен тип даних має свій setter-метод
Запити до бази даних PostgreSQL у Java

Давайте потренуємось!

Запити до бази даних PostgreSQL у Java

Preparing Video For Download...