ในการพัฒนา Web Application ที่ต้องการความปลอดภัยสูง การป้องกัน SQL Injection ด้วย Prepared Statements แตกต่างจากการใช้ mysql_real_escape_string() อย่างไรในเชิงหลักการ
กทั้งสองวิธีป้องกัน SQL Injection ได้เท่ากันในทุกกรณี ขึ้นอยู่กับความชอบของนักพัฒนา
ขPrepared Statements แยก SQL Structure กับข้อมูลออกจากกันโดยสิ้นเชิง ทำให้ข้อมูลไม่มีโอกาสถูกตีความเป็น SQL Command ส่วน escape เพียงแค่แก้ไขอักขระพิเศษซึ่งอาจมีช่องโหว่
คPrepared Statements ทำงานเร็วกว่า mysql_real_escape_string() เสมอ แต่ความปลอดภัยเท่ากัน
งmysql_real_escape_string() ปลอดภัยกว่า Prepared Statements สำหรับตัวเลข
เฉลยอธิบาย
Prepared Statements (PDO หรือ MySQLi) ทำงานโดยส่ง SQL Template ไปยังฐานข้อมูลก่อน แล้วจึงส่งข้อมูลแยกกัน ทำให้ Database Engine รู้ว่าส่วนใดคือ Structure และส่วนใดคือ Data อย่างแน่นอน จึงไม่มีทางที่ User Input จะกลายเป็น SQL Command ได้ ส่วน escape_string เพียงแค่ Sanitize อักขระในสตริง ซึ่งมีช่องโหว่ที่เป็นไปได้ในบางชุดอักขระและ Context นอกจากนี้ mysql_real_escape_string() เป็น Extension ที่ถูก Deprecated แล้วใน PHP