Sử dụng Prepared Statements

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Miller Trujillo

Staff Software Engineer

Vấn đề với Statements

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
  • SQL injection xảy ra khi đầu vào người dùng được chèn trực tiếp vào SQL
String title = "' OR 1 = 1 --";
  • Kẻ tấn công có thể thay đổi logic truy vấn
String query = "SELECT * FROM books WHERE title = '' OR 1 = 1 --'";

$$

  • SQL Injection có thể sửa đổi dữ liệu của bạn 🚫
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

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"
  • Tất cả bản ghi sẽ bị xóa 🔄

$$

  • Hạn chế quyền giúp ích, nhưng chưa đủ
  • Kẻ tấn công vẫn có thể truy vấn dữ liệu nhạy cảm
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Prepared Statements

  • Câu lệnh SQL biên dịch sẵn, dùng placeholder
String sql = "SELECT * FROM books WHERE title = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland");
ResultSet rs = pstmt.executeQuery();
  • Tham số được escape và xử lý như dữ liệu, không bao giờ là SQL thực thi 🔒
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Làm việc với nhiều tham số

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();
  • Mỗi kiểu dữ liệu có phương thức setter riêng
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Cùng luyện tập nào!

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Preparing Video For Download...