Použití připravených příkazů

Dotazování PostgreSQL databáze v Javě

Miller Trujillo

Staff Software Engineer

Problém s příkazy Statement

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
  • SQL injection nastane, když je vstup uživatele vložen přímo do SQL
String title = "' OR 1 = 1 --";
  • Útočníci mohou změnit logiku dotazu
String query = "SELECT * FROM books WHERE title = '' OR 1 = 1 --'";

$$

  • SQL Injection může upravit naše data 🚫
Dotazování PostgreSQL databáze v Javě

SQL Injection

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"
  • Všechny záznamy budou smazány 🔄

$$

  • Omezení oprávnění pomáhá, ale nestačí
  • Útočníci mohou stále dotazovat citlivá data
Dotazování PostgreSQL databáze v Javě

Připravené příkazy

  • Předkompilovaný SQL příkaz používající zástupné symboly
String sql = "SELECT * FROM books WHERE title = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland");
ResultSet rs = pstmt.executeQuery();
  • Parametry jsou escapovány a považovány za data, nikdy jako spustitelný SQL 🔒
Dotazování PostgreSQL databáze v Javě

Práce s více parametry

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();
  • Každý datový typ má vlastní metodu setter
Dotazování PostgreSQL databáze v Javě

Pojďme si procvičit!

Dotazování PostgreSQL databáze v Javě

Preparing Video For Download...