การใช้ Prepared Statements

การคิวรีฐานข้อมูล PostgreSQL ด้วย Java

Miller Trujillo

Staff Software Engineer

ปัญหาของ Statements

String query = "SELECT * FROM books WHERE title = '" + title + "'";
stmt.executeQuery(query);
  • SQL injection เกิดขึ้นเมื่อนำ input ของผู้ใช้ฝังลงใน SQL {{2}} โดยตรง
String title = "' OR 1 = 1 --";
  • ผู้โจมตีสามารถเปลี่ยนแปลงตรรกะของคิวรีได้
String query = "SELECT * FROM books WHERE title = '' OR 1 = 1 --'";

$$

  • SQL Injection สามารถแก้ไขข้อมูลของเราได้ 🚫
การคิวรีฐานข้อมูล PostgreSQL ด้วย 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"
  • ระเบียนทั้งหมดจะถูกลบ 🔄

$$

  • การจำกัดสิทธิ์ช่วยได้ แต่ยังไม่เพียงพอ
  • ผู้โจมตียังสามารถดึงข้อมูลที่ละเอียดอ่อนได้
การคิวรีฐานข้อมูล PostgreSQL ด้วย Java

Prepared Statements

  • คำสั่ง SQL ที่ถูกคอมไพล์ล่วงหน้าโดยใช้ตัวแทนค่า (placeholder)
String sql = "SELECT * FROM books WHERE title = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setString(1, "Alice in Wonderland");
ResultSet rs = pstmt.executeQuery();
  • พารามิเตอร์จะถูก escape และถูกมองเป็นข้อมูลเท่านั้น ไม่ใช่ 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 method เป็นของตัวเอง
การคิวรีฐานข้อมูล PostgreSQL ด้วย Java

มาฝึกกันเถอะ!

การคิวรีฐานข้อมูล PostgreSQL ด้วย Java

Preparing Video For Download...