ในการเขียนโปรแกรม ASP การรับรองความถูกต้องของข้อมูลประจำตัวอาจกล่าวได้ว่าใช้กันทั่วไป แต่เราจะบรรลุความปลอดภัยในการรับรองความถูกต้องได้อย่างไร?
หน้าการส่งแบบฟอร์ม: sub.htm
<html>
<หัว>
<title>เข้าสู่ระบบของผู้ดูแลระบบ</title>
<ร่างกาย>
<ชื่อฟอร์ม = "form1" method = "โพสต์" action = "sub.asp">
<p>ผู้ดูแลระบบ:
<input type="text" name="UserID" size="25" maxlength="20">
รหัสผ่าน:
<input type="text" name="Pass" size="12" maxlength="20">
<input type="submit" name="Submit" value="Submit">
</p>
</แบบฟอร์ม>
</ร่างกาย>
</html>
โปรแกรม SUB.asp
-
รับข้อมูลจากแบบฟอร์ม
user=request.from("รหัสผู้ใช้")
ตรวจสอบว่าข้อมูลที่ส่งโดยแบบฟอร์มว่างเปล่า (คุณสามารถใช้ JAVASCRIPT หรือ VBSCRIPT เพื่อควบคุมหน้าแบบฟอร์ม แต่อย่าลืมควบคุมที่นี่!
ถ้าผู้ใช้ = "" แล้ว
ไปที่หน้าข้อความแสดงข้อผิดพลาด!
การตอบสนองเปลี่ยนเส้นทาง "err1.htm"
ประโยคนี้อาจไม่มีประโยชน์แต่ขอเสริมด้วย!
การตอบสนองสิ้นสุด
สิ้นสุดถ้า
ผ่าน=request.from("ผ่าน")
ถ้าผ่าน = "" แล้ว
การตอบสนองเปลี่ยนเส้นทาง "err2.htm"
การตอบสนองสิ้นสุด
สิ้นสุดถ้า
เข้าร่วมฐานข้อมูล
file=server.mappath("ฐานข้อมูลของคุณ")
ตั้งค่า conn=server.createobject("adodb.connection")
dr="driver={ไดรเวอร์การเข้าถึง Microsoft (*.mdb)};dbq="&file
con.open ดร
ตั้งค่า rs=server.createobject("adodb.recordset")
สิ่งสำคัญคือภาษา SQL ที่นี่
sql="select * จากตารางโดยที่ user= "&user&" และ pass= "&pass&" "
rs.open sql
ถ้าไม่ใช่ rs.eof แล้ว
หากพบให้ไปที่หน้าการจัดการ
response.redirect "login.asp"
อื่น
หากไม่พบ คุณจะเข้าสู่หน้าข้อผิดพลาด
การตอบกลับเขียน "err3.htm"
สิ้นสุดถ้า
-
ทุกคนรู้สึกว่าโค้ดข้างต้นควรจะใช้ได้ แต่มีความเสี่ยงด้านความปลอดภัยที่ร้ายแรงที่นี่:
หากฉันต้องการเข้าสู่ระบบผู้ดูแลระบบ ฉันสามารถป้อนรหัสนั้นลงในช่องป้อนแบบฟอร์ม SUb.htm:
ป้อนในช่องข้อความแรก: a หรือ 1 = 1 หรือ OR =
ป้อนข้อมูลในกล่องข้อความที่สอง: a หรือ 1 = 1 หรือ OR =
ส่ง ทุกคนจะเห็น... "โอ้ ฟังฉันนะ โอเค ฉันจะโยนอิฐทิ้งทีหลัง..."
"a" และ "1" เป็นอักขระใดๆ
บางคนอาจถามว่าทำไมคุณถึงเข้ามาเป็นผู้ดูแลระบบเมื่อคุณป้อนอักขระเหล่านี้? -
ในความเป็นจริงอักขระเหล่านี้เป็นการหลอกลวงภาษา SQL ในโปรแกรมของคุณ สำหรับผู้ที่ป้อนสำเร็จ
โปรดดู: เมื่อเริ่มโปรแกรม SQL ตารางจะถูกสอบถามสำหรับบันทึกที่ตรงกับ user= "&user&" และ pass= " &pass&" "conditions
sql="select * from table โดยที่ user= "&user&" และ pass= "&pass&" "
หลังจากที่ฉันป้อนโค้ดข้างต้น มันกลายเป็น:
sql="select * from table โดยที่ user= a หรือ 1 = 1 และ pass= a หรือ 1 = 1 "
มาดูกันว่ามีเหตุผลใดบ้างที่จะไม่เข้า ? ขอเหตุผลที่จะไม่เข้าด้วย!
เช่นเดียวกันหากช่อง USER PASS ด้านบนเป็นตัวเลข
วิธีแก้ไข:
1.
ใช้ REPLACE แทนที่อักขระพิเศษ ในเนื้อหาที่ผู้ใช้ป้อนเพื่อให้บรรลุวัตถุประสงค์ในการควบคุม! sql="select * from table โดยที่ user= "&replace(user," "," ")&" และ pass= "&replace(pass," "," ")& " "
วิธีนี้สามารถแทนที่อักขระได้ครั้งละหนึ่งตัวเท่านั้น ที่จริงแล้วอักขระอันตรายไม่เพียงแต่ " " เท่านั้น แต่ยังรวมถึงอักขระเช่น ">", "<", "&", "%" เป็นต้น ซึ่ง ควรได้รับการควบคุมอย่างสมบูรณ์ แต่ฉันควรทำอย่างไรหากฟังก์ชัน REPLACE ไม่เหมาะสม
2. วิธีการควบคุมโปรแกรม
ใช้โปรแกรมเพื่อควบคุมเนื้อหาทั้งหมดที่ป้อนโดยไคลเอ็นต์เพื่อให้อักขระหรือรหัสที่เป็นอันตรายที่เป็นไปได้ที่ผู้ใช้ป้อนเข้าไป จะถูกควบคุมอย่างเต็มที่ นี่คือวิธีการของฉัน!
-
บันทึกเนื้อหาแบบฟอร์มที่ผู้ใช้ส่งมา
ผู้ใช้=request.from("ผู้ใช้")
ผ่าน=request.from("ผ่าน")
-
การควบคุมแบบวนซ้ำเริ่มต้นขึ้น
สำหรับ i=1 ถึง len (ผู้ใช้)
ใช้ฟังก์ชัน MID เพื่ออ่านอักขระที่ตำแหน่ง i ในผู้ใช้ตัวแปร
เรา=กลาง(ผู้ใช้,i,1)
เปรียบเทียบอักขระที่อ่าน
ถ้า us=" " หรือ us="%" หรือ us="<" หรือ us=">" หรือ us="&" แล้ว
หากมีอักขระข้างต้น ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น ไม่สามารถมีอักขระพิเศษข้างต้นได้
การตอบสนองเปลี่ยนเส้นทาง "err2.htm"
การตอบสนองสิ้นสุด
สิ้นสุดถ้า
ต่อไป
-
-