คำสั่งที่เตรียมไว้มีประโยชน์มากในการป้องกันการฉีด MySQL
คำสั่งที่เตรียมไว้ใช้เพื่อดำเนินการคำสั่ง SQL ที่เหมือนกันหลาย ๆ อันอย่างมีประสิทธิภาพมากขึ้น
คำสั่งที่เตรียมไว้ทำงานดังนี้:
การประมวลผลล่วงหน้า: สร้างเทมเพลตคำสั่ง SQL และส่งไปยังฐานข้อมูล ค่าที่สงวนไว้จะถูกทำเครื่องหมายด้วยพารามิเตอร์ "?" ตัวอย่างเช่น:
INSERT INTO MyGuests (ชื่อ, นามสกุล, อีเมล) ค่า(?, ?, ?)
การแยกวิเคราะห์ฐานข้อมูล การคอมไพล์ การเพิ่มประสิทธิภาพแบบสอบถามบนเทมเพลตคำสั่ง SQL และการจัดเก็บผลลัพธ์โดยไม่มีเอาต์พุต
การดำเนินการ: สุดท้าย ค่าที่ผูกกับแอปพลิเคชันจะถูกส่งผ่านไปยังพารามิเตอร์ ("?" เครื่องหมาย) และฐานข้อมูลจะดำเนินการคำสั่ง แอปพลิเคชันสามารถดำเนินการคำสั่งได้หลายครั้งหากค่าพารามิเตอร์แตกต่างกัน
เมื่อเปรียบเทียบกับการดำเนินการคำสั่ง SQL โดยตรง คำสั่งที่เตรียมไว้มีข้อดีหลักสองประการ:
คำสั่งที่เตรียมไว้จะช่วยลดเวลาในการวิเคราะห์ได้อย่างมาก เนื่องจากมีการสืบค้นเพียงครั้งเดียว (แม้ว่าคำสั่งจะถูกดำเนินการหลายครั้งก็ตาม)
การเชื่อมโยงพารามิเตอร์จะลดแบนด์วิดท์ของเซิร์ฟเวอร์ คุณเพียงแค่ต้องส่งพารามิเตอร์ของการสืบค้นแทนการส่งคำสั่งทั้งหมด
คำสั่งที่เตรียมไว้มีประโยชน์มากสำหรับการแทรก SQL เนื่องจากมีการใช้โปรโตคอลที่แตกต่างกันหลังจากส่งค่าพารามิเตอร์เพื่อให้มั่นใจในความถูกต้องของข้อมูล
ตัวอย่างต่อไปนี้ใช้คำสั่งที่เตรียมไว้ใน MySQLi และผูกพารามิเตอร์ที่เกี่ยวข้อง:
แยกวิเคราะห์โค้ดแต่ละบรรทัดตามตัวอย่างต่อไปนี้:
"INSERT INTO MyGuests (ชื่อ, นามสกุล, อีเมล) ค่า(?, ?, ?)"ในคำสั่ง SQL เราใช้เครื่องหมายคำถาม (?) ในที่นี้เราสามารถแทนที่เครื่องหมายคำถามด้วยจำนวนเต็ม สตริง จุดลอยตัวที่มีความแม่นยำสองเท่า และค่าบูลีน
ต่อไปเรามาดูฟังก์ชันbind_param()กัน:
$stmt->bind_param("sss", $firstname, $lastname, $email);ฟังก์ชันนี้จะผูกพารามิเตอร์ SQL และบอกฐานข้อมูลถึงค่าของพารามิเตอร์ คอลัมน์พารามิเตอร์ "sss" จัดการประเภทข้อมูลของพารามิเตอร์ที่เหลือ อักขระ s บอกฐานข้อมูลว่าพารามิเตอร์นั้นเป็นสตริง
พารามิเตอร์มีสี่ประเภท:
ฉัน - จำนวนเต็ม (ประเภทจำนวนเต็ม)
d - สองเท่า (ชนิดจุดลอยตัวที่มีความแม่นยำสองเท่า)
ส - สตริง
b - BLOB (วัตถุไบนารีขนาดใหญ่: วัตถุไบนารีขนาดใหญ่)
พารามิเตอร์แต่ละตัวต้องมีประเภทที่ระบุ
คุณสามารถลดความเสี่ยงของการแทรก SQL ได้โดยบอกฐานข้อมูลถึงประเภทข้อมูลของพารามิเตอร์
หมายเหตุ: หากคุณต้องการแทรกข้อมูลอื่น (อินพุตของผู้ใช้) การตรวจสอบความถูกต้องของข้อมูลมีความสำคัญมาก |
ในตัวอย่างต่อไปนี้ เราใช้คำสั่งที่เตรียมไว้และพารามิเตอร์การผูกใน PDO: