ผู้สอน: อย่างที่คุณเคยเห็นมา
การฉีด SQL นั้นอันตรายมาก
นอกจากนี้ยังง่ายต่อการ (พึมพำ) และหาง่ายมาก
คุณจะพบได้ทุกที่ในเว็บไซต์ที่มีชื่อเสียงบางแห่ง
ผู้คนพยายามป้องกันช่องโหว่เหล่านี้โดยใช้ตัวกรอง
ตัวกรองสามารถทำให้ดูเหมือนไม่มีช่องโหว่ แต่ถ้าคุณพยายามมากขึ้นโดยใช้การเข้ารหัส
การเข้ารหัสประเภทต่างๆ หรือใช้พร็อกซี คุณจะสามารถข้ามตัวกรองเหล่านี้ได้เกือบทั้งหมด
โปรแกรมเมอร์บางคนใช้บัญชีดำ
เช่น ป้องกันการใช้ยูเนี่ยน ป้องกันการใช้เม็ดมีดและสิ่งของเช่นนั้น
อีกครั้งมันไม่ปลอดภัย 100%
มันสามารถข้ามได้
ใช้ไวท์ลิสต์?
ปัญหาเดียวกันกับบัญชีดำ
วิธีที่ดีที่สุดคือการตั้งโปรแกรมเว็บแอปพลิเคชันของคุณในลักษณะที่ไม่อนุญาตให้มีการฉีดโค้ดเข้าไปแล้วดำเนินการ
วิธีที่ดีที่สุดในการทำเช่นนั้นคือการใช้คำสั่งแบบกำหนดพารามิเตอร์โดยแยกข้อมูลและโค้ดออกจากกัน
วิธีที่ดีที่สุดที่จะแสดงให้คุณเห็นว่าฉันหมายถึงอะไรโดยใช้ตัวอย่าง
ฉันกำลังเขียนโปรแกรมให้น้อยที่สุดในตัวอย่างนี้
ฉันไม่ต้องการให้เป็นตัวอย่างการเขียนโปรแกรม
จริงๆ แล้วมีข้อผิดพลาดในการเขียนโปรแกรมอยู่
แต่ฉันพยายามที่จะให้คุณมีแนวคิดมากกว่าการเขียนโปรแกรม
โค้ดที่มีช่องโหว่ที่เรากำลังดูเคยใช้ในการทำเช่นนี้
มันเคยเลือก * จากบัญชีที่ชื่อผู้ใช้เท่ากับสิ่งที่เราใส่ใน
textbox1
แล้วเราก็เคยใส่ textbox1
มาใส่ตรงนี้ เราเคยบอกว่า
admin แล้วก็ปิดใบเสนอราคา
จากนั้นเราสามารถทำการเลือกสหภาพและดำเนินการอย่างอื่นได้
จากนั้นเมื่อเราทำเสร็จแล้ว เราเคยเพิ่มความคิดเห็นซึ่งโดยพื้นฐานแล้วจะละเว้นทุกอย่างที่เข้ามาหลังจากนั้น
ดังนั้น เมื่อคุณคัดลอกและวางลงในนี้
คุณจะเห็นว่าเกิดอะไรขึ้น
ทีนี้ มากำจัดสิ่งนี้กันเถอะ
เพราะนี่เป็นเพียงการทำให้สีไม่สวย
(พึมพำ) ที่จริงก็แค่แสดงความคิดเห็นเกี่ยวกับเรื่องนี้
มันจะทำการ select * จากบัญชีที่ username
เท่ากับ admin, union select และดำเนินการทุกอย่างที่เราต้องการจะทำ
สิ่งนี้แย่มากและยากที่จะป้องกันได้
อย่างที่ฉันพูด การใช้ตัวกรองและสิ่งของต่างๆ
เราจะซ่อนปัญหาเท่านั้น จะไม่แก้ไข
วิธีที่ดีที่สุดในการทำเช่นนี้คือการใช้คำสั่งแบบกำหนดพารามิเตอร์แบบเดียวกัน
นี่เป็นวิธีที่ปลอดภัย
ก่อนอื่น คุณเตรียมคำแถลงของคุณ
ภาษาส่วนใหญ่เช่น PHP และทั้งหมดนั้นมีฟังก์ชันเช่นนั้น
คุณสามารถเตรียม select * จากบัญชีที่ username
เท่ากับเครื่องหมายคำถาม
จากนั้นคุณส่งค่า
ตอนนี้ PHP รู้แล้ว
คำสั่ง SQL คือ select * จากบัญชีที่ username
เท่ากับบางสิ่งบางอย่าง
แล้วมันจะเอาค่าของ textbox1
ดังนั้น แม้ว่าเราจะเข้ามาและใช้คำสั่งลับๆ
ล่อๆ ของเราที่นี่ และวางลงในนั้น เว็บแอปพลิเคชันก็จะรู้ว่าค่าสำหรับสิ่งนี้คือการเลือก admin union
จริงๆ แล้วมันจะลองไปเลือก
* จากบัญชีที่มี username แล้วเพิ่มเครื่องหมายคำพูดของตัวเองเข้าไป แล้วพยายามหา
username ที่มี username ต่อไปนี้
สิ่งทั้งปวงนี้จะถูกประหารชีวิตเช่นนั้น
ดังนั้นจะเป็นการเลือก
* จากบัญชีที่ชื่อผู้ใช้เท่ากับ admin union select
แฮชแท็กนี้
สิ่งที่คุณใส่ในกล่องข้อความของคุณจะถูกส่งเป็นค่า
เว็บแอปพลิเคชันจะรู้ว่านี่คือค่า
ไม่ใช่โค้ด และจะไม่มีวันดำเนินการ
ดังนั้น สิ่งนี้จะปกป้องคุณจากการฉีด SQL
คุณสามารถใช้ตัวกรองเป็นแนวป้องกันที่สอง
และฉันยังแนะนำให้คุณใช้สิทธิ์น้อยที่สุดเท่าที่จะเป็นไปได้
สำหรับแต่ละฐานข้อมูล ให้ใช้ผู้ใช้หนึ่งรายที่มีสิทธิ์น้อยที่สุดที่พวกเขาต้องการ
ไม่อนุญาตให้ผู้ใช้ทำสิ่งที่พวกเขาต้องการ
หากเป็นเว็บไซต์ธรรมดาที่ทำการเลือกเท่านั้น ก็ให้ผู้ใช้เลือกได้เท่านั้น
หากจำเป็นต้องเลือกและแทรกเท่านั้น
ให้เลือกและแทรกเท่านั้น
นี่เป็นกฎที่คุณควรเก็บไว้กับทุกสิ่ง
แม้แต่กับระบบ Linux
ตรวจสอบให้แน่ใจว่ามีการอนุญาตน้อยที่สุดเสมอ
ผู้ใช้แต่ละคนไม่มีสิทธิ์พิเศษที่พวกเขาไม่ต้องการ