ช่องโหว่ทางเว็บประเภทหนึ่งที่ใหญ่ที่สุดเรียกว่า “SQL Injection” หรือ SQLi Structured Query Language หรือที่เรียกว่า SQL คือ ภาษาที่ใช้โต้ตอบกับฐานข้อมูลส่วนใหญ่ แม้ว่าจะมีการใช้ภาษาที่หลากหลายขึ้นอยู่กับฐานข้อมูล แพลตฟอร์ม. เว็บไซต์ใดๆ ที่จัดเก็บข้อมูลผู้ใช้ เช่น ข้อมูลบัญชี หรือให้ฟังก์ชันการอัปโหลดของผู้ใช้ เช่น เว็บไซต์ที่โฮสต์รูปภาพ จะใช้ฐานข้อมูลเพื่อจัดเก็บข้อมูลนั้น
เคล็ดลับ: โดยทั่วไปแล้ว SQL จะออกเสียงว่า “ess cue ell” หรือ “sequel” โดยตัวเลือกแรกจะใช้กันทั่วไปในภาษาอังกฤษแบบบริติช และตัวเลือกที่สองที่แพร่หลายกว่าในภาษาอังกฤษแบบอเมริกัน โดยทั่วไปแล้วการออกเสียงทั้งสองจะเข้าใจในบริบทของการพูดถึงฐานข้อมูล
SQLi คืออะไร?
SQLi เป็นช่องโหว่ที่นักพัฒนาเว็บที่ออกแบบโค้ดที่สื่อสารระหว่าง เว็บเซิร์ฟเวอร์และฐานข้อมูลไม่ได้ใช้การป้องกันคำสั่ง SQL ที่ส่งโดยa ผู้ใช้ ปัญหาคือมันเป็นไปได้ที่จะหลีกเลี่ยงคำสั่งฐานข้อมูลและเพิ่มอาร์กิวเมนต์ใหม่หรือคำสั่งใหม่ทั้งหมด คำสั่งฐานข้อมูลที่เปลี่ยนแปลงหรือคำสั่งที่สองสามารถดำเนินการได้หลายอย่าง ซึ่งรวมถึงการลบขนาดใหญ่ที่อาจเกิดขึ้นหรือการรั่วไหลของข้อมูล
การหาประโยชน์มักเกี่ยวข้องกับการทำให้ข้อความสั่งที่มีอยู่เป็นจริงในทุกสถานการณ์ หรือการจัดเตรียมคำสั่งชุดที่สองที่ดำเนินการบางอย่าง เช่น การลบหรือแสดงข้อมูลทั้งหมด ตัวอย่างเช่น คำสั่ง SQL เพื่อเข้าสู่ระบบเว็บไซต์อาจตรวจสอบว่าชื่อผู้ใช้และรหัสผ่านที่ส่งมาตรงกับรายการในฐานข้อมูลหรือไม่ ในการพยายามเข้าถึงช่องโหว่ของการฉีด SQL อาจพยายามเพิ่มส่วนคำสั่ง "หรือจริง" เช่น "หรือ 1 = 1" สิ่งนี้จะทำให้คำสั่งอยู่ในบรรทัดของ “เข้าสู่ระบบด้วยชื่อผู้ใช้ [นี้] หากรหัสผ่านเป็น [นี่] หรือคำสั่งนี้เป็นความจริง”
วิธีป้องกัน SQLi
SQLi เคยเป็นวิธีที่ใช้กันทั่วไปสำหรับเว็บไซต์ในการเจาะฐานข้อมูลและรั่วไหลทางออนไลน์ เนื่องจากความพยายามร่วมกันเพื่อให้แน่ใจว่าการรับรู้ความปลอดภัยเป็นส่วนหนึ่งของการฝึกอบรมนักพัฒนา ช่องโหว่ประเภทนี้ได้รับการแก้ไขเป็นส่วนใหญ่และแทบจะไม่พบเห็นอีกต่อไป
วิธีที่ถูกต้องในการป้องกัน SQLi คือการใช้คำสั่งที่เตรียมไว้ หรือที่เรียกว่าการสืบค้นแบบกำหนดพารามิเตอร์ ตามเนื้อผ้า คำสั่ง SQL จะถูกประกาศและให้อินพุตของผู้ใช้ถูกเชื่อมเข้าด้วยกันในระหว่างการประกาศนั้น ด้วยคำสั่งที่เตรียมไว้ คำสั่งฐานข้อมูลจะถูกเขียนออกมา จากนั้นฟังก์ชัน sperate จะรันคำสั่งและแทรกข้อมูลผู้ใช้ แม้ว่าสิ่งนี้อาจดูเหมือนความแตกต่างเล็กน้อย แต่จะเปลี่ยนวิธีการจัดการคำสั่งโดยสิ้นเชิง ความแตกต่างนี้ป้องกันคำสั่ง SQL ที่มีความหมายจากการรันและถือว่าอินพุตของผู้ใช้ทั้งหมดเป็นสตริง ป้องกันไม่ให้การฉีด SQL เกิดขึ้น