Ewebeditor และ fckeditork editor กรองเครื่องหมายคำพูดเดี่ยว
เราใช้วิธีการเขียนของ SQL=insert into product(title,content) ค่า(' &request(title)& ' ,' &request(content)& ' ) ดังนั้นเราจึงพบเนื้อหาที่ลูกค้า COPYed ลงในโปรแกรมแก้ไขในขณะนั้น และพบว่า เนื้อหานี้มีเครื่องหมายคำพูดเดี่ยว ปรากฎว่าเป็นเพราะเนื้อหาที่ลูกค้าส่งถึงบรรณาธิการมีเครื่องหมายคำพูดเดี่ยวที่คำสั่ง SQL ของเราเปลี่ยนแปลง ซึ่งเทียบเท่ากับ SQL=insert into product( ค่าชื่อเนื้อหา) ('เนื้อหา' ,'content') กลายเป็น SQL=insert into product(title,content)values('content','content'') ถ้าเรามองใกล้ ๆ เราจะรู้ว่าเพียงเพราะมีเครื่องหมายคำพูดเดี่ยวพิเศษในเนื้อหา คำสั่ง SQL เกิดขึ้น มีข้อผิดพลาดในการเขียนร้ายแรง อย่างไรก็ตาม เรายังแปลกใจที่เนื่องจากเขียนไม่ถูกต้อง เหตุใดคำสั่ง SQL จึงไม่แสดงข้อความแสดงข้อผิดพลาด แต่ยังแจ้งว่าการดำเนินการสำเร็จแล้ว นึกถึงแฮกเกอร์ตัวเล็กๆ ทั่วไปในปี 2003 ชอบใช้ 'or' =' หรือ' ดูเหมือนว่าวิธีการบุกรุกพื้นหลังจะใช้ประโยชน์จากข้อผิดพลาดที่เครื่องหมายคำพูดเดี่ยวไม่ถูกกรองเมื่อดำเนินการ SQL ดังนั้นไม่ว่า SQL จะถูกดำเนินการอย่างไร ผลลัพธ์ก็จะกลับมาเป็นจริง ฮ่าๆ ฉันไม่ได้คาดหวังเช่นนั้น การเขียนโปรแกรมควรจะเรียบง่ายและชัดเจนที่สุดเท่าที่จะเป็นไปได้ซึ่งถือเป็นข้อผิดพลาดเช่นกัน โอเค พบปัญหาแล้ว ในอนาคตก่อนที่ SQL ทั้งหมดจะถูกป้อนลงในฐานข้อมูล เราจะกรองฟิลด์ต่างๆ ก่อนที่จะส่งค่า เพื่อไม่ให้ปัญหานี้เกิดขึ้นอีกต่อไป ด้านล่างนี้คือฟังก์ชันการกรองความปลอดภัยของ SQL ที่สมบูรณ์มาก ก็พร้อมเรียกได้เลย
ฟังก์ชัน HTMLEncode(Str)
ถ้า Isnull(Str) แล้ว
HTMLเข้ารหัส=
ออกจากฟังก์ชัน
สิ้นสุดถ้า
Str = แทนที่(Str,Chr(0),, 1, -1, 1)
Str = แทนที่(Str, , ", 1, -1, 1)
Str = แทนที่(Str,<,<, 1, -1, 1)
Str = แทนที่(Str,>,>, 1, -1, 1)
Str = แทนที่ (Str, script, script, 1, -1, 0)
Str = แทนที่(Str, SCRIPT, SCRIPT, 1, -1, 0)
Str = แทนที่(Str, สคริปต์, Script, 1, -1, 0)
Str = แทนที่(Str, script, Script, 1, -1, 1)
Str = แทนที่ (Str, วัตถุ, วัตถุ, 1, -1, 0)
Str = แทนที่(Str, OBJECT, OBJECT, 1, -1, 0)
Str = แทนที่(Str, วัตถุ, O วัตถุ, 1, -1, 0)
Str = แทนที่ (Str, วัตถุ, วัตถุ, 1, -1, 1)
Str = แทนที่(Str, แอปเพล็ต, applet, 1, -1, 0)
Str = แทนที่(Str, APPLET, APPLET, 1, -1, 0)
Str = แทนที่(Str, แอพเพล็ต, Applet, 1, -1, 0)
Str = แทนที่(Str, แอปเพล็ต, Applet, 1, -1, 1)
Str = แทนที่(Str, [, [)
Str = แทนที่(Str, ], ])
Str = แทนที่(Str, , , 1, -1, 1)
Str = แทนที่(Str, =, =, 1, -1, 1)
Str = แทนที่(Str, ', '', 1, -1, 1)
Str = แทนที่ (Str, เลือก, เลือก, 1, -1, 1)
Str = แทนที่ (Str, ดำเนินการ, execute, 1, -1, 1)
Str = แทนที่(Str, exec, exec, 1, -1, 1)
Str = แทนที่(Str, เข้าร่วม, join, 1, -1, 1)
Str = แทนที่(Str, union, union, 1, -1, 1)
Str = แทนที่(Str, ที่ไหน, ที่ไหน, 1, -1, 1)
Str = แทนที่(Str, insert, insert, 1, -1, 1)
Str = แทนที่ (Str, ลบ, เดล, 1, -1, 1)
Str = แทนที่ (Str, อัปเดต, ขึ้น & กิน, 1, -1, 1)
Str = แทนที่(Str, like, like, 1, -1, 1)
Str = แทนที่(Str, drop, drop, 1, -1, 1)
Str = แทนที่(Str, สร้าง, cre กิน, 1, -1, 1)
Str = แทนที่ (Str, เปลี่ยนชื่อ, เปลี่ยนชื่อ, 1, -1, 1)
Str = แทนที่(Str, นับ, ร่วม, 1, -1, 1)
Str = แทนที่(Str, chr, chr, 1, -1, 1)
Str = แทนที่(Str, กลาง, mi d, 1, -1, 1)
Str = แทนที่ (Str, ตัดทอน, ตัดทอน, 1, -1, 1)
Str = แทนที่(Str, nchar, nch'r, 1, -1, 1)
Str = แทนที่ (Str, ถ่าน, ch'r, 1, -1, 1)
Str = แทนที่ (Str, แก้ไข, alte r, 1, -1, 1)
Str = แทนที่ (Str, โยน, ไม่สามารถ, 1, -1, 1)
Str = แทนที่(Str, มีอยู่, eists, 1, -1, 1)
Str = แทนที่(Str,Chr(13), , 1, -1, 1)
HTMLEncode = แทนที่ (Str,','', 1, -1, 1)
ฟังก์ชันสิ้นสุด