แนะนำ: พูดคุยเกี่ยวกับไดเรกทอรีต้นไม้ของ DHTML XML ASP CSS ไดเรกทอรีต้นไม้แสดงปัญหาโปรแกรมคำอธิบาย: ตารางข้อมูลที่เกี่ยวข้องกับตนเองมักจะปรากฏในโครงการของเรา หากเราดูพวกเขาจากมุมมองโดยรวมตารางทั้งหมดจะถูกนำเสนอเป็นโครงสร้างข้อมูลต้นไม้ (สำหรับกรณีที่ซับซ้อนอาจกลายเป็นกราฟ) เมื่อเราทำตารางนี้
ในการเขียนโปรแกรม ASP การตรวจสอบตัวตนสามารถกล่าวได้ว่ามักจะใช้ แต่เราจะบรรลุความปลอดภัยการรับรองความถูกต้องได้อย่างไร?
หน้าส่งแบบฟอร์ม: sub.htm
| ต่อไปนี้เป็นเนื้อหาที่ยกมา: <html> <head> <title> ผู้ดูแลระบบเข้าสู่ระบบ </title> <body> <form name = form1 method = post action = sub.asp> <p> ผู้ดูแลระบบ: <ประเภทอินพุต = ชื่อข้อความ = userId size = 25 maxLength = 20> รหัสผ่าน: <ประเภทอินพุต = ชื่อข้อความ = pass size = 12 maxLength = 20> <ประเภทอินพุต = ส่งชื่อ = ส่งค่า = ส่ง> </p> </form> </body> </html> |
| ต่อไปนี้เป็นเนื้อหาที่ยกมา: โปรแกรม sub.asp - รับข้อมูลจากแบบฟอร์ม user = request.from (userId) ตรวจสอบว่าข้อมูลที่ส่งในแบบฟอร์มว่างเปล่า (หน้าฟอร์มอาจถูกควบคุมโดย JavaScript หรือ VBScript แต่อย่าลืมควบคุมที่นี่! ถ้า user = ดังนั้น ไปที่หน้าพรอมข้อผิดพลาด! Response.redirect err1.htm ประโยคนี้อาจไร้ประโยชน์ แต่เป็นการดีกว่าที่จะเพิ่ม! Response.end สิ้นสุดถ้า Pass = request.from (pass) ถ้าผ่าน = จากนั้น Response.redirect err2.htm Response.end สิ้นสุดถ้า เข้าร่วมฐานข้อมูล file = server.mappath (ฐานข้อมูลของคุณ) SET Conn = Server.CreateObject (ADODB.Connection) dr = driver = {Microsoft Access Driver (*.mdb)}; dbq = & ไฟล์ conn.open dr ตั้งค่า rs = server.createObject (adodb.recordset) กุญแจสำคัญคือภาษา SQL ที่นี่ SQL = เลือก * จากตารางที่ผู้ใช้ = & ผู้ใช้ & และ pass = & pass & Rs.Open SQL ถ้าไม่ใช่ rs.eof แล้ว หากพบให้ไปที่หน้าการจัดการ reponse.redirect login.asp อื่น หากไม่พบให้ป้อนหน้าข้อผิดพลาด Response.write err3.htm สิ้นสุดถ้า - |
ทุกคนรู้สึกว่ารหัสข้างต้นควรจะดี แต่นี่เป็นความเสี่ยงด้านความปลอดภัยที่ร้ายแรง:
หากฉันต้องการเข้าสู่ระบบไปยังผู้ดูแลระบบฉันสามารถป้อนได้ในกล่องอินพุตแบบฟอร์ม sub.htm:
ป้อนในกล่องข้อความแรก: A หรือ 1 = 1 หรือหรือ = =
ป้อนในกล่องข้อความที่สอง: A หรือ 1 = 1 หรือหรือ = =
ส่งมันคุณจะเห็น ... วูฟังฉันดีไหมที่จะทำอิฐจะถูกโยนอีกครั้ง ...
A และ 1 เป็นอักขระใด ๆ
บางคนอาจถามว่าทำไมคุณถึงป้อนอักขระเหล่านี้ในฐานะผู้ดูแลระบบ? -
ในความเป็นจริงตัวละครเหล่านี้เป็นการหลอกลวงภาษา SQL ในโปรแกรมของคุณและป้อนสำเร็จ
ทุกคนเห็น: เริ่มโปรแกรม SQL เป็นบันทึกที่สืบค้นตารางและตรงกับผู้ใช้ = & ผู้ใช้ & และ pass = & pass & เงื่อนไข
SQL = เลือก * จากตารางที่ผู้ใช้ = & ผู้ใช้ & และ pass = & pass &
ฉันป้อนรหัสด้านบนและมันก็กลายเป็น:
SQL = SELECT * จากตารางที่ผู้ใช้ = A หรือ 1 = 1 และ PASS = A หรือ 1 = 1
มาดูกันเถอะมีเหตุผลที่จะไม่เข้าไหม - ให้เหตุผลที่จะไม่เข้าก่อน!
ฟิลด์ Pass ผู้ใช้ด้านบนเป็นประเภทตัวละครและถ้าเป็นประเภทตัวเลขก็เหมือนกันจริง!
สารละลาย:
1. วิธีการทางเลือกฟังก์ชัน:
ใช้แทนที่เพื่อแทนที่อินพุตเนื้อหาโดยผู้ใช้ด้วยอักขระพิเศษเพื่อให้บรรลุวัตถุประสงค์ในการควบคุม! SQL = SELECT * จากตารางที่ผู้ใช้ = & แทนที่ (ผู้ใช้ ,,) & และ pass = & แทนที่ (pass ,,) &
วิธีนี้สามารถแทนที่อักขระได้ครั้งละหนึ่งตัวเท่านั้น ในความเป็นจริงตัวละครที่เป็นอันตรายไม่เพียง แต่ยังมีตัวละครเช่น>, <, &, % ควรควบคุมอย่างเต็มที่ แต่ฉันควรทำอย่างไรถ้าฉันไม่ได้มีความสามารถในการแทนที่ฟังก์ชั่น? -
2. วิธีการควบคุมโปรแกรม
ใช้โปรแกรมเพื่อควบคุมเนื้อหาทั้งหมดที่ป้อนโดยไคลเอนต์เพื่อให้คุณสามารถควบคุมอักขระหรือรหัสอันตรายที่เป็นไปได้ใด ๆ ที่คุณป้อนโดยไคลเอนต์ ฉันจะทำวิธีนี้!
| ต่อไปนี้เป็นเนื้อหาที่ยกมา: - จับภาพเนื้อหาแบบฟอร์มที่ส่งโดยผู้ใช้ user = request.from (ผู้ใช้) Pass = request.from (pass) - การควบคุมวัฏจักรเริ่มต้นขึ้น สำหรับ i = 1 ถึง len (ผู้ใช้) ใช้ฟังก์ชั่นกลางเพื่ออ่านอักขระที่ตำแหน่ง I ในผู้ใช้ตัวแปร us = mid (ผู้ใช้, i, 1) การเปรียบเทียบอักขระอ่าน ถ้าเรา = หรือเรา =% หรือเรา = <หรือเรา => หรือเรา = และจากนั้น หากมีอักขระข้างต้นข้อความแสดงข้อผิดพลาดจะเกิดขึ้น ไม่สามารถมีอักขระพิเศษข้างต้นได้ Response.redirect err2.htm Response.end สิ้นสุดถ้า ต่อไป - - |
แบ่งปัน: Parse ASP และขั้นตอนที่เก็บไว้ มีบทความมากมายเกี่ยวกับ ASP และขั้นตอนที่เก็บไว้ แต่ฉันสงสัยว่าผู้เขียนได้ฝึกฝนจริง ๆ แล้ว ฉันอ่านข้อมูลที่เกี่ยวข้องมากมายเมื่อฉันอยู่ในช่วงแรกและพบว่าวิธีการที่มีให้หลายวิธีไม่ใช่กรณีในทางปฏิบัติ สำหรับแอปพลิเคชันง่าย ๆ นี้