บทความนี้สอนเขียน PHP ป้องกัน SQL Injection ด้วยคำสั่ง prepare และ bind_param โดย SQL Injection คือวิธีการโจมตีระบบโดยการแทรกคำสั่ง SQL ลงในชุดคำสั่ง SQL ของระบบ การใช้คำสั่งดังกล่าวจะช่วยป้องกัน SQL Injection ได้ สามารถเขียนโค้ดได้ดังนี้
ตัวอย่าง PHP ป้องกัน SQL Injection
พิจารณาการเขียนโค้ดแบบเดิม ที่ไม่ได้ใช้คำสั่ง prepare และ bind_param มีการส่งตัวแปร name เข้าไปในคำสั่ง SQL โดยตรง
$sql = "INSERT INTO product (name) VALUES ('$name')";
if ($conn->query($sql) === TRUE) {
...
}
เปลี่ยนมาใช้คำสั่ง prepare และ bind_param กับโค้ดด้านบน เพื่อป้องกัน SQL Injection ได้ดังนี้
$stmt = $conn->prepare("INSERT INTO product (name, price) VALUES (?, ?)");
$stmt->bind_param("si", $name, $price);
if ($stmt->execute() === TRUE) {
...
}
โค้ดใหม่นี้มีการใช้คำสั่ง prepare และ bind_param เพื่อป้องกันการโจมตีแบบ SQL Injection ของภาษา PHP โดยหลักการคือ
1. prepare จะเตรียมคำสั่ง SQL พร้อมค่าใดๆ ที่จะส่งเข้าไปด้วยเครื่องหมาย ?
2. bind_param จะนำค่าตัวแปรที่ต้องการใส่เข้าไปใน SQL โดย เรียงลำดับตามคำสั่ง SQL เช่น
2.1 s แรกคือ string อ้างถึงตัวแปรแรก คือ $name
2.2 i สองคือ int อ้างถึงตัวแปรสอง คือ $price
3. เวลาประมวลผลคำสั่ง SQL จะใช้ execute แทน query