Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ข้อจำกัดของ mysql_real_escape_string ใน MySQL

mysql_real_escape_string() เป็นฟังก์ชันเก่า (Deprecated ใน PHP 5.5, ลบใน PHP 7.0) มีข้อจำกัดและความเสี่ยงด้านความปลอดภัยหลายประการ

ข้อจำกัดหลัก

1. ไม่ปลอดภัยกับ Prepared Statements

เมื่อใช้กับ Prepared Statements จะทำให้เกิด Double Escaping หรือข้ามการป้องกัน Injection ได้

2. ไม่รองรับ Type Safety

ฟังก์ชันนี้จัดการได้แค่ String ไม่สามารถป้องกัน Injection ในคอลัมน์ที่เป็น Numeric ได้

-- อันตราย: Type Casting ไม่ช่วยป้องกัน
(TypeCast)mysql_real_escape_string($_REQUEST['id'])

3. ขึ้นอยู่กับ Character Set ของ Connection

ถ้า Character Set ไม่ตรงกัน (เช่น Client ใช้ UTF-8, Server ใช้ Latin1) อาจ Escape ไม่ถูกต้อง

4. ต้องมี Connection เปิดอยู่

ต้องเรียกหลัง mysql_connect() เท่านั้น ไม่สามารถใช้ Standalone ได้

วิธีที่แนะนำแทน (Best Practice)

ใช้ Prepared Statements (Parameterized Queries)

// PDO Example
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $userId]);

// MySQLi Example
$stmt = $mysqli->prepare('SELECT * FROM users WHERE id = ?');
$stmt->bind_param('i', $userId);
$stmt->execute();

สรุป

  • ห้ามใช้ mysql_real_escape_string ในโค้ดใหม่
  • ย้ายไปใช้ PDO หรือ MySQLi Prepared Statements
  • ใช้ ORM/Query Builder ที่จัดการ Escaping ให้อัตโนมัติ