ตัวอย่างเช่น
SELECT * FROM members WHERE username = '$username'ที่นี้ เมื่อตัวแปร $username มีค่าเท่ากับ What รูปแบบคำสั่งก็จะเป็นแบบนี้
SELECT * FROM members WHERE username = 'What'แต่เมื่อใดที่ตัวแปร $username ไม่ได้เท่ากับ What (หรือ string ธรรมดาก็ตาม) แต่เป็นคำสั่งจากคนแฮก
เช่น ตัวแปร $username เท่ากับ Hacker' and sleep(9999) --
คำสั่งที่ถูก query ก็จะหน้าตาแบบนี้
SELECT * FROM members WHERE username = 'Hacker' and sleep(9999) -- 'จะเห็นว่า ระหว่างคำว่า Hacker จะถูกปิดด้วยเครื่องหมาย ' (single quote) อย่างสมบูรณ์ และมีคำสั่งเพิ่มขึ้นมา นั่นคือ and sleep(9999) -- ( -- คือเครื่องหมาย comment )
โดยจะทำตาม 2 เงื่อนไขก็คือ ดึงข้อมูลของคนที่ชื่อว่า Hacker และ ทำการ sleep ไป 9999 วินาที ก็คือทำให้เว็บล่มไป 9999 วินาที
ส่วน -- ข้างหลังก็คือเครื่องหมาย comment ที่ทำให้ทุกตัวอักษรที่อยุ่ข้างหลังทั้งหมดกลายเป็น text ธรรมดาและไม่ถูกทำงาน
ที่นี้อธิบายตัวอย่าง SQL injection มายาวแล้ว ซึ่งสามารถทำได้เยอะกว่านี้อีก
การป้องกันก็ไม่ยาก ให้ทำการกรอง Input ด้วยฟังชั่น PHP mysql_real_escape_string() ก็สามารถป้องกันได้เบื้องต้น
ตัวอย่างการใช้งาน
$username = mysql_real_escape_string($username);
mysql_query(SELECT * FROM members WHERE username = '$username' );
หรือถ้าตัวแปรบางอย่างเป็นชนิดตัวเลขจำนวนเต็ม (Integer)
ก็ควรกำหนดชนิดตัวแปรไว้ด้วย
if(isset($_GET['id'])) $page_id = (int)$_GET['id'];
0 ความคิดเห็น:
แสดงความคิดเห็น