การโจมตีแบบ SQL Inject เกิดจากความไม่สมบูรณ์ในคำสั่งโปรแกรมของเรา มาดูวิธีใช้ฟังก์ชัน Instr ใน ASP เพื่อป้องกันการโจมตีแบบ SQL Inject กันดีกว่า สิ่งที่เฉพาะเจาะจงควรเป็นเช่นนี้
ถ้า instr(Request(id), )>0 หรือ instr(Request(id),')>0 แล้ว response.redirect index.htm
แน่นอนคุณสามารถเขียนสิ่งที่คุณต้องการหลังจากนั้นได้!
เรามาเรียนรู้ฟังก์ชัน instr กันก่อน:
ไวยากรณ์
InStr([เริ่มต้น, ]string1, string2[, เปรียบเทียบ])
ไวยากรณ์ของฟังก์ชัน InStr มีพารามิเตอร์ต่อไปนี้:
คำอธิบายพารามิเตอร์
เริ่มต้นเป็นทางเลือก นิพจน์ตัวเลขที่กำหนดตำแหน่งเริ่มต้นสำหรับการค้นหาแต่ละครั้ง หากละเว้น การค้นหาจะเริ่มต้นที่ตำแหน่งอักขระตัวแรก หาก start มีค่า Null แสดงว่าเกิดข้อผิดพลาด หากระบุการเปรียบเทียบ จำเป็นต้องมีพารามิเตอร์เริ่มต้น
จำเป็นต้องมี String1 ยอมรับนิพจน์สตริงเพื่อค้นหา
สตริง2
ที่จำเป็น. นิพจน์สตริงที่จะค้นหา
การเปรียบเทียบเป็นทางเลือก ค่าตัวเลขที่ระบุประเภทของการเปรียบเทียบที่ใช้ในการประเมินสตริงย่อย ดูส่วนการตั้งค่าสำหรับค่าตัวเลข หากละเว้น จะทำการเปรียบเทียบแบบไบนารี
พารามิเตอร์การเปรียบเทียบสามารถมีค่าต่อไปนี้:
คำอธิบายค่าคงที่
vbBinaryCompare 0 ทำการเปรียบเทียบไบนารี
vbTextCompare 1 ทำการเปรียบเทียบข้อความ
[ค่าส่งคืน]
ฟังก์ชัน InStr ส่งกลับค่าต่อไปนี้:
หาก InStr กลับมา
string1 มีความยาวเป็นศูนย์ 0
string1 เป็น Null Null
string2 คือการเริ่มต้นที่มีความยาวเป็นศูนย์
string2 เป็น Null Null
ไม่พบ string2 0
ค้นหา string2 ใน string1 ค้นหาตำแหน่งของสตริงที่ตรงกัน
เริ่มต้น > Len(string2) 0
ตัวอย่างต่อไปนี้ใช้สตริงการค้นหา InStr:
Dim SearchString, SearchChar, MyPos
SearchString =XXpXXpXXPXXP ' สตริงที่จะค้นหา
SearchChar = P ' ค้นหา P.
MyPos = Instr(4, SearchString, SearchChar, 1) 'การเปรียบเทียบข้อความส่งคืน 6 โดยเริ่มจากอักขระตัวที่สี่
MyPos = Instr(1, SearchString, SearchChar, 0) 'การเปรียบเทียบไบนารี่ส่งคืน 9 โดยเริ่มจากอักขระตัวแรก
MyPos = Instr(SearchString, SearchChar) ' กลับ 9.
' ค่าเริ่มต้นเป็นการเปรียบเทียบแบบไบนารี (ละเว้นอาร์กิวเมนต์สุดท้าย)
MyPos = Instr(1, SearchString, W) 'การเปรียบเทียบไบนารีส่งคืน 0 โดยเริ่มจากอักขระ 1 (ไม่พบ W)
โปรดทราบว่าฟังก์ชัน InStrB ใช้ข้อมูลไบต์ที่มีอยู่ในสตริง ดังนั้น InStrB จะไม่ส่งคืนตำแหน่งอักขระของการปรากฏครั้งแรกของสตริงหนึ่งในอีกสตริงหนึ่ง แต่จะส่งคืนตำแหน่งไบต์
สรุป: ฟังก์ชันของ instr คือ: คืนตำแหน่งของอักขระหรือสตริงที่ปรากฏครั้งแรกในสตริงอื่น ให้เราดูว่าโค้ดใด:
ถ้า instr(Request(id), )>0 หรือ instr(Request(id),')>0 แล้ว
ความหมาย: เปรียบเทียบตำแหน่งเฉพาะของอักขระ (ช่องว่าง) และอักขระ (') ในคำขอ (id) (การเปรียบเทียบไบนารี) หากพบอักขระ (ช่องว่าง) และ (') แสดงว่าเป็นคำสั่งหลังจากนั้น!
ตอนนี้ทุกคนเข้าใจความหมายแล้ว!
เห็นครั้งแรกก็บอก แล้วถ้าเป็น asp ล่ะ? ไม่ผิดหรอกหรือที่จะทำผิดพลาดเมื่อเพิ่มอักขระ (; หรือ,) และอักขระอื่น ๆ ใน Id=90 (ใช่ คำตอบคือ ใช่ :)
อาจมีคนอื่นบอกว่า ฉันจะเพิ่มอักขระบางตัวในคำสั่ง if instr(Request(id), )>0 หรือ instr(Request(id),')>0 แล้ว เช่น เปลี่ยนเป็น: if instr(Request (id ), )>0 หรือ instr(Request(id),')>0 หรือ instr(Request(id),;)>0 หรือ instr(Request(id),, )>0 แล้ว
เดี๋ยวค่อยเพิ่มทีหลังก็ได้ 555! (นี่เป็นสิ่งที่ดี! แต่มันแย่กว่า :)
ใช่ หลังจากเพิ่มสิ่งนี้เข้าไป ก็สามารถเอาชนะสิ่งที่เรียกว่าแฮกเกอร์ได้อย่างแน่นอน!
จริงๆ แล้ว มันไม่จำเป็นเลย คุณลืมประโยค instr(Request(id), )>0 ไปแล้วหรือยัง? ตราบใดที่ยังมีประโยคนี้อยู่ มันจะไร้ประโยชน์ไหมสำหรับคนที่เรียกว่าแฮกเกอร์ที่จะพูด และ 1 = 1