SQL Injection

SQL Injection เป็นช่องโหว่ด้านความปลอดภัยที่เกิดในส่วน
database ของ application มีสาเหตุมาจากการ escape ตัวแปร
ใน SQL statement อย่างไม่ถูกต้อง

สมมุติว่า มีโค้ดต่อไปนี้ใน application และ parameter "userName" ซึ่งประกอบด้วย
ชื่อผู้ใช้ ช่องโหว่แบบ SQL Injection เกิดขึ้นในโค้ดนี้:

statement := "SELECT * FROM users WHERE name = '" + userName + "';"

ถ้าป้อน "a'; DROP TABLE users; SELECT * FROM data WHERE name LIKE '%"
เข้าไปในส่วน "userName" จะทำให้เกิด SQL statement ต่อไปนี้

SELECT * FROM users WHERE name = 'a'; DROP TABLE users; SELECT * FROM data WHERE name LIKE '%';

ฐานข้อมูลจะเอ็กซิคิวท์ statement ตามลำดับ คือ select data, drop user table
และ select data ทำให้ผู้ใช้เว็ปสามารถดูหรือแก้ไขข้อมูลใด ๆ ที่อยู่ในฐานข้อมูล
ที่ผู้ใช้ที่เชื่อมโยงกับฐานข้อมูลสามารถอ่าน หรือแก้ไขได้

ช่องโหว่แบบ SQL Injection สามารถแก้ไขได้ใน programming language ส่วนใหญ่
ในภาษา Java ควรมีการใช้ PreparedStatement class

แทนที่จะใช้

Connection con = (acquire Connection)
Statement stmt = con.createStatement();
ResultSet rset = stmt.executeQuery("SELECT * FROM users WHERE name = '" + userName + "';");

ให้ใช้โค้ดต่อไปนี้แทน

Connection con = (acquire Connection)
PreparedStatement pstmt = con.prepareStatement("SELECT * FROM users WHERE name = ?");
pstmt.setString(1, userName);
ResultSet rset = stmt.executeQuery();

แหล่งข้อมูลเพิ่มเติม

http://www.derkeiler.com/Mailing-Lists/securityfocus/secprog/2001-07/0001.html
http://www.nextgenss.com/papers/advanced_sql_injection.pdf

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License