SQL Injection คือ วิธีการหนึ่งที่ถูกนำมาใช้ในการเจาะระบบด้วยช่องโหว่ทางการเขียนโปรแกรมรวมกับคำสั่งของ SQL ที่ส่งไปประมวลผล โดยบทความนี้แนะนำวิธีป้องกัน SQL Injection บน PHP และ MySQLi ด้วย 2 วิธี ดังนี้
วิธีป้องกัน SQL Injection บน PHP และ MySQLi
1. ใช้คำสั่ง prepare เพื่อกรองเงื่อนไขในการประมวลคำสั่ง SQL ด้วย parameter
2. ใช้ function real_escape_string() สำหรับค่าที่ Input เข้ามาก่อนส่งเข้าเงื่อนไขใน SQL
ตัวอย่างวิธีป้องกัน SQL Injection บน PHP และ MySQLi
<?
$conn = new mysqli("127.0.0.1", "root", "", "db_coffee");
$conn->query("set names utf8");
$pvc_title = $conn->real_escape_string("%ก%");
$sql = " select pvc_title from tb_province where ( pvc_title like ? ) ";
$pp = $conn->prepare($sql);
$pp->bind_param("s", $pvc_title);
$pp->execute();
$pp->bind_result($pvc_title);
while( $pp->fetch()) {
echo $pvc_title.'<br/>';
}
?>
อธิบายคำสั่งเบื้องต้นกับการป้องกัน SQL Injection บน PHP และ MySQLi
1. บรรทัดที่ 4 คำสั่ง real_escape_string() ใช้สำหรับการป้องกันอักขระแปลกปลอมจากการส่งเข้ามายังโปรแกรม
2. บรรทัดที่ 5 คำสั่ง SQL จะเปลี่ยนเป็นเครื่องหมาย ? แทนเงื่อนไขแบบเดิม เช่น pvc_title = '$pvc_title'
3. บรรทัดที่ 6 คำสั่ง prepare() คือ ส่วนเริ่มต้นการใข้คำสั่ง prepare โดยมีการส่งคำสั่ง SQL เป็นค่า parameter
4. บรรทัดที่ 7 คำสั่ง bind_param คือ ส่วนการกำหนดค่า parameter .ในส่วนของเครื่องหมาย ? ในคำสั่ง SQL โดย ค่า parameter แรก s คือ แทนที่ตัวแปรชนิด String และค่า parameter ที่ 2 แทนค่าตัวแปรที่เป็นเงื่อนไข
5. บรรทัดที่ 8 คำสั่ง execute() คือ คำสั่งประมวลผล
6. บรรทัดที่ 9 คำสั่ง bind_result() คือ การผูกเข้ากับ Field ที่ระบุ เพื่อใช้สำหรับการแสดงผล หากกรณีมีการระบุ Field มากกว่า 1 Field ให้กำหนดค่าตัวแปรเพิ่ม เช่น bind_result( $pvc_id, $pvc_title)
7. บรรทัดที่ 10 - 14 คือ คำสั่งการแสดงผล