จริงๆเรื่องนี้เป็นเรื่องที่เก่ามากเป็น 10 ปีแล้ว และมีการเขียนเรื่องนี้ไว้ทั้งในวิกิและในบล็อกต่างๆเป็นจำนวนมาก หากแต่โปรแกรมเมอร์มือใหม่อาจไม่ค่อยใส่ใจหรือไม่ทราบปัญหาตรงนี้อย่างจริงจังนัก ทั้งที่หากถูกเจาะระบบจากส่วนนี้แล้วจะเกิดความเสียหายอย่างใหญ่หลวงถึงขั้นข้อมูลลูกค้าหายไปจากฐานข้อมูลทั้งหมดได้เลย ผมเลยอยากจะเขียนบทความนี้อีกครั้ง เพื่อให้เป็นความรู้และอยากให้ทุกคนตระหนักถึงปัญหาอย่างจริงจังเสียที
SQL Injection คืออะไร
คือช่องโหว่ที่เกิดจากการส่งผ่านข้อมูลจากผู้ใช้เข้ามายัง SQL Statement เพื่อสั่งให้ทำ คำสั่ง/เหตุการณ์ อื่นนอกเหนือจากสิ่งที่โปรแกรมเมอร์ต้องการ ยกตัวอย่างเช่น หากเราจะทำระบบล็อกอินเราก็ต้องรับค่า Username กับ Password ด้วยการเขียนโค้ดแบบนี้
หาก ผู้ใช้ ป้อนค่า
username เป็น ชื่อผู้ใช้ใดๆก็ได้ที่อยู่ในระบบ
password เป็น ' OR '1'='1
จะทำให้สามารถล็อกอินเข้าระบบเป็นใครก็ได้ทันที เนื่องจาก SQL Statement มีค่าเป็น
SELECT * FROM db_user WHERE username='[ชื่อผู้ใช้]' AND password= '' OR '1'='1';
เท่ากับว่าเงื่อนไขนี้เป็นจริงเสมอ
ในกรณีเลวร้ายสุดคือ ลบข้อมูลในตารางทิ้งซะเลย โดยการกรอกค่า
username เป็น ' OR '1'='1
password เป็น ' OR '1'='1' ; DELETE FROM db_user WHERE '1'='1
ทำให้ SQL String มีค่าเป็น
SELECT * FROM db_user WHERE username='' OR '1'='1' AND password= '' OR '1'='1' ; DELETE FROM db_user WHERE '1'='1' ;
ส่วนวิธีการแก้ไขปัญหาตรงจุดนี้ของ PHP แนะนำให้ใช้ Prepare Statement เข้ามาคลุม แล้วส่งค่าผ่านฟังก์ชั่น bindParam แทนที่การแทรกลงใน String ตรงๆ จากตัวอย่างดังกล่าวโค้ดจะมีหน้าตาประมาณนี้ครับ
ส่วนภาษาอื่นก็มีเช่นกัน สามารถค้นหาจากกูเกิ้ลโดยพิมพ์ในช่องค้นหาเป็น "[ภาษา] Prepare Statement"
ไม่มีความคิดเห็น:
แสดงความคิดเห็น