การโจมตีแบบฉีด PHP และ SQL [2]
Magic Quotes
ดังที่กล่าวไว้ข้างต้น การแทรก SQL ส่วนใหญ่จะส่งข้อมูลที่ไม่ปลอดภัยไปยังฐานข้อมูลเพื่อให้บรรลุวัตถุประสงค์ของการโจมตี เพื่อป้องกันการโจมตีด้วยการแทรก SQL นั้น PHP มาพร้อมกับฟังก์ชันที่สามารถประมวลผลสตริงอินพุตและดำเนินการประมวลผลความปลอดภัยเบื้องต้นกับอินพุตในระดับที่ต่ำกว่า นั่นก็คือ Magic Quotes (php.ini magic_quotes_gpc) ถ้า magic_quotes_gpc
หากเปิดใช้งานตัวเลือกนี้ เครื่องหมายคำพูดเดี่ยว เครื่องหมายคำพูดคู่ และอักขระอื่นๆ ในสตริงอินพุตจะขึ้นหน้าด้วยเครื่องหมายแบ็กสแลช
แต่ Magic Quotes ไม่ใช่วิธีแก้ปัญหาแบบสากล มันไม่ได้บล็อกอักขระที่อาจเป็นอันตรายทั้งหมด และบนเซิร์ฟเวอร์หลายแห่ง Magic Quotes ไม่ได้เปิดใช้งาน ดังนั้นเราจึงจำเป็นต้องใช้วิธีอื่น ๆ เพื่อป้องกันการฉีด SQL
ฐานข้อมูลจำนวนมากมีฟังก์ชันการประมวลผลข้อมูลอินพุตนี้โดยกำเนิด ตัวอย่างเช่น ฟังก์ชันการดำเนินการ MySQL ของ PHP มีฟังก์ชันที่เรียกว่า mysql_real_escape_string() ซึ่งสามารถหลีกเลี่ยงอักขระพิเศษและอักขระที่อาจทำให้เกิดข้อผิดพลาดในการดำเนินการฐานข้อมูล
อ้างถึง:
http://cn2.php.net/mysql_real_escape_string
หากคุณสนใจสามารถอ่านความคิดเห็นด้านล่างได้ :)
ดูโค้ดนี้:
//หากเปิดใช้งานฟังก์ชัน Magic Quotes แล้ว
ถ้า (get_magic_quotes_gpc()) {
$name = แถบสแลช($ชื่อ);
}อื่น{
$name = mysql_real_escape_string($ชื่อ);
}
mysql_query("SELECT * FROM users WHERE name='{$name}'");
โปรดทราบว่าก่อนที่เราจะใช้ฟังก์ชันที่ได้รับจากฐานข้อมูล เราต้องพิจารณาว่า Magic Quotes เปิดอยู่หรือไม่ เช่นเดียวกับในตัวอย่างด้านบน จะถูกทำซ้ำสองครั้ง การประมวลผลจะผิดพลาด หากเปิดใช้งาน MQ เราจำเป็นต้องลบ ที่เพิ่มเข้ามาเพื่อรับข้อมูลจริง
นอกเหนือจากการประมวลผลข้อมูลในรูปแบบสตริงข้างต้นแล้ว เมื่อจัดเก็บข้อมูลไบนารี่ในฐานข้อมูล คุณควรใส่ใจกับการประมวลผลล่วงหน้าด้วย มิฉะนั้นข้อมูลอาจขัดแย้งกับรูปแบบการจัดเก็บข้อมูลของฐานข้อมูล ทำให้ฐานข้อมูลเสียหาย บันทึกข้อมูลสูญหาย หรือแม้แต่ฐานข้อมูลทั้งหมดสูญหาย ฐานข้อมูลบางแห่ง เช่น PostgreSQL มีฟังก์ชัน pg_escape_bytea() ที่ใช้เป็นพิเศษในการเข้ารหัสข้อมูลไบนารี ซึ่งสามารถเข้ารหัสข้อมูลที่คล้ายกับ Base64 ได้
ชอบ:
// สำหรับการใช้ข้อมูลข้อความธรรมดา:
pg_escape_string($regular_strings);
// สำหรับการใช้ข้อมูลไบนารี่:
pg_escape_bytea($binary_data);
ในอีกกรณีหนึ่ง เราจำเป็นต้องใช้กลไกดังกล่าวด้วย นั่นก็คือภาษาแบบหลายไบต์ เช่น จีน ญี่ปุ่น ฯลฯ ที่ระบบฐานข้อมูลไม่รองรับนั่นเอง บางส่วนมีช่วง ASCII ที่ทับซ้อนกับช่วงข้อมูลไบนารี
อย่างไรก็ตาม การเข้ารหัสข้อมูลอาจทำให้การสืบค้น เช่น LIKE abc% ล้มเหลว