ปัญหาของการ query ใน PDO ของ PHP
ดังที่คุณทราบดีแล้วว่า คำสั่ง SQL นั้นเสี่ยงต่อการถูกโจมตีด้วย SQL injection ส่วนขยาย PDO ถูกสร้างขึ้นมาเพื่อจัดการกับปัญหา injection เหล่านี้ แต่ โดยค่าเริ่มต้นแล้ว มันจะไม่ทำการป้องกันให้โดยอัตโนมัติ
เรามาดูปัญหาด้วยตัวอย่างกัน สมมติว่าเรามีคำสั่ง query ต่อไปนี้ ซึ่งมีการแทรกตัวแปรเข้าไป:
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
สมมติว่าตัวแปรของเรามาจากแหล่งข้อมูลภายนอก เช่น มาจากพารามิเตอร์ GET เพื่อให้ง่ายขึ้น เรามากำหนดค่า ของมันด้วยมือกัน เราคาดหวังว่าจะได้ค่า ตัวเลขบางค่า เช่น ค่านี้:
<?php
$id = 1;
?>
อย่างไรก็ตาม แฮกเกอร์เจ้าเล่ห์สามารถส่ง
ค่าต่อไปนี้มาได้ (สมมติว่าเรามี
ฟิลด์ role):
<?php
$id = '-1 OR role="admin"';
?>
ปรากฏว่า เราต้องการคำสั่ง query นี้:
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
แต่กลับได้คำสั่ง query ต่อไปนี้ ซึ่งดึงข้อมูล ผู้ดูแลระบบของเว็บไซต์ออกมา:
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
เพื่อหลีกเลี่ยงสถานการณ์เช่นนี้ ใน PDO จึงมีกลไกพิเศษเตรียมไว้ ซึ่งเรียกว่า prepared statements ซึ่งเราจะมาศึกษาในบทเรียนถัดไป
ให้ลองทำ SQL injection ไปยังฐานข้อมูลของคุณอย่างตั้งใจ