ในการเขียนโปรแกรม ASP การรับรองความถูกต้องของข้อมูลประจำตัวอาจกล่าวได้ว่าใช้กันทั่วไป แต่เราจะบรรลุความปลอดภัยในการรับรองความถูกต้องได้อย่างไร?
หน้าการส่งแบบฟอร์ม: sub.htm
<html>
<หัว>
<title>เข้าสู่ระบบของผู้ดูแลระบบ</title>
<ร่างกาย>
<ชื่อฟอร์ม=form1วิธีการ=ลงรายการบัญชีการกระทำ=sub.asp>
<p>ผู้ดูแลระบบ:
<ประเภทอินพุต=ชื่อข้อความ=ขนาด UserID=25 ความยาวสูงสุด=20>
รหัสผ่าน:
<ประเภทอินพุต=ชื่อข้อความ=ขนาดผ่าน=12 ความยาวสูงสุด=20>
<ประเภทอินพุต=ชื่อส่ง=ค่าส่ง=ส่ง>
</p>
</แบบฟอร์ม>
</ร่างกาย>
</html>
โปรแกรม SUB.asp
-
รับข้อมูลจากแบบฟอร์ม
ผู้ใช้=request.from(UserID)
ตรวจสอบว่าข้อมูลที่ส่งโดยแบบฟอร์มว่างเปล่า (คุณสามารถใช้ 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.opensql
ถ้าไม่ใช่ rs.eof แล้ว
หากพบให้ไปที่หน้าการจัดการ
response.redirect เข้าสู่ระบบ asp
อื่น
หากไม่พบ คุณจะเข้าสู่หน้าข้อผิดพลาด
การตอบกลับเขียน err3.htm
สิ้นสุดถ้า
-
ทุกคนรู้สึกว่าโค้ดข้างต้นน่าจะใช้ได้ แต่ที่นี่มีความเสี่ยงด้านความปลอดภัยอย่างร้ายแรง:
หากฉันต้องการเข้าสู่ระบบในฐานะผู้ดูแลระบบ ฉันสามารถป้อนลงในช่องป้อนข้อมูลแบบฟอร์ม SUb.htm:
ป้อนในกล่องข้อความแรก: a หรือ 1 = 1 หรือ OR =
ป้อนในกล่องข้อความที่สอง: a หรือ 1 = 1 หรือ OR =
ส่งทุกคนจะได้เห็น... โอ้ ฟังฉันนะ โอเค ฉันจะโยนอิฐทิ้งทีหลัง...
a และ 1 เป็นอักขระใดๆ
บางคนอาจถามว่าทำไมคุณถึงใส่อักขระเหล่านี้เพื่อเข้าเป็นผู้ดูแลระบบ? -
อันที่จริงอักขระเหล่านี้ใช้เพื่อหลอกลวงภาษา SQL ในโปรแกรมของคุณและป้อนได้สำเร็จ
ดังที่คุณเห็น: ในโปรแกรมเริ่มต้น SQL ตารางจะถูกสอบถามสำหรับบันทึกที่ตรงตามเงื่อนไข user= &user& และ pass= &pass&
sql=select * จากตารางโดยที่ user= &user& และ pass= &pass&
หลังจากที่ฉันป้อนโค้ดข้างต้น มันกลายเป็น:
sql=select * จากตาราง โดยที่ user= a หรือ 1 = 1 และ pass= a หรือ 1 = 1
มีเหตุผลใดบ้างที่จะไม่เข้า? - ขอเหตุผลที่จะไม่เข้าก่อนสิ!
ช่อง USER PASS ด้านบนเป็นประเภทอักขระ และจะเหมือนกันหากเป็นประเภทตัวเลข!
สารละลาย:
1. วิธีการทดแทนฟังก์ชัน:
ใช้ REPLACE เพื่อแทนที่อักขระพิเศษที่มีอยู่ในเนื้อหาที่ผู้ใช้ป้อนเพื่อให้บรรลุวัตถุประสงค์ในการควบคุม! sql=select * จากตารางโดยที่ user= &replace(user, , )& และ pass= &replace(pass, , )&
วิธีนี้สามารถแทนที่อักขระได้ครั้งละหนึ่งตัวเท่านั้น ที่จริงแล้ว ไม่เพียงแต่อักขระที่เป็นอันตรายเท่านั้น แต่ยังควรควบคุมอักขระ เช่น >, <, &, % ฯลฯ ด้วย แต่ฉันควรทำอย่างไรหากฉันไม่สามารถใช้ฟังก์ชัน REPLACE ได้ -
2. วิธีการควบคุมโปรแกรม
ใช้โปรแกรมเพื่อควบคุมเนื้อหาทั้งหมดที่ลูกค้าป้อน เพื่อให้สามารถควบคุมอักขระหรือรหัสที่เป็นอันตรายที่เป็นไปได้ที่ผู้ใช้ป้อนได้อย่างเต็มที่ นี่คือวิธีการของฉัน!
-
บันทึกเนื้อหาแบบฟอร์มที่ผู้ใช้ส่งมา
ผู้ใช้=request.from(ผู้ใช้)
ผ่าน=request.from(ผ่าน)
-
การควบคุมแบบวนซ้ำเริ่มต้นขึ้น
สำหรับ i=1 ถึง len (ผู้ใช้)
ใช้ฟังก์ชัน MID เพื่ออ่านอักขระที่ตำแหน่ง i ในผู้ใช้ตัวแปร
เรา = กลาง (ผู้ใช้, i,1)
เปรียบเทียบอักขระที่อ่าน
ถ้าเรา= หรือ us=% หรือ us=< หรือ us=> หรือ us=& แล้ว
หากมีอักขระข้างต้น ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น ไม่สามารถมีอักขระพิเศษข้างต้นได้
การตอบสนองการเปลี่ยนเส้นทาง err2.htm
การตอบสนองสิ้นสุด
สิ้นสุดถ้า
ต่อไป
-
-