วันพุธที่ 22 เมษายน พ.ศ. 2558

ป้องการกันโดน SQL Injection

SQL Injection คือช่องโหว่จากการป้อน Input ที่ไปขัดการทำงานของ syntax แล้วทำการ inject  คำสั่ง sql เข้าไปประมวลผลภายใน server
ตัวอย่างเช่น
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 ความคิดเห็น:

แสดงความคิดเห็น