Использование подготовленных выражений

Работа с базой данных PostgreSQL на Java

Miller Trujillo

Staff Software Engineer

Проблема с операторами Statement

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

Подготовленные выражения

  • Предварительно скомпилированный 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();
  • Для каждого типа данных предусмотрен свой метод-сеттер
Работа с базой данных PostgreSQL на Java

Давайте потренируемся!

Работа с базой данных PostgreSQL на Java

Preparing Video For Download...