กฎพื้นฐานสำหรับการเขียนโปรแกรม asp มือใหม่ 1. ข้อผิดพลาดทั่วไปที่มือใหม่ทำ
ฉันเห็นข้อผิดพลาดพื้นฐานทั่วไปในโค้ดของโพสต์จำนวนมากในฟอรัม ซึ่งเป็นประเภทฟิลด์ที่ไม่ถูกต้อง
โปรแกรมและฐานข้อมูลเชื่อมต่อกันอย่างใกล้ชิด ช่องฐานข้อมูลประเภทข้อความหรือประเภทเวลาใช้เครื่องหมายคำพูดเดี่ยว
ตัวอย่างเช่น คำสั่งที่แก้ไขต่อไปนี้:
conn.execute update Counts set counts='&counts&' โดยที่ num=&num& และ Atime='&now()&'
ด้านซ้ายของเครื่องหมายเท่ากับคือชื่อฟิลด์ และด้านขวาของเครื่องหมายเท่ากับคือชื่อตัวแปรที่ส่งเข้ามา ฟิลด์การนับเป็นประเภทข้อความ ดังนั้นจึงต้องเพิ่มเครื่องหมายคำพูดเดี่ยวก่อนและหลังการเขียน ซึ่งจะเหมือนกัน ไม่ว่าจะเป็นการเขียนหรือการสืบค้น ในข้อความค้นหาที่ตามมา ช่อง num จะเป็นประเภทตัวเลข ดังนั้นจึงไม่มีเครื่องหมายคำพูดเดี่ยวก่อนและหลังช่อง Atime จึงเป็นประเภทเวลา ดังนั้นจึงต้องใช้เครื่องหมายคำพูดเดี่ยวก่อนและหลัง
สิ่งที่สำคัญที่สุดคือการสืบค้นด้วย ID ช่อง ID จะต้องไม่ซ้ำกันและเป็นประเภทตัวเลข แน่นอนว่าต้องไม่มีเครื่องหมายคำพูดเดี่ยวก่อนและหลังเมื่อทำการสืบค้นหมายเลข ID
conn.execute update Counts set counts='&counts&' โดยที่ id='&id&' 'วิธีเขียนผิด
conn.execute update Counts set counts='&counts&' โดยที่ id=&id 'วิธีการเขียนที่ถูกต้อง
2. การเชื่อมต่อฐานข้อมูล ACCESS
โดยปกติมีสองวิธีในการเชื่อมต่อกับฐานข้อมูล โดยพื้นฐานแล้วมือใหม่ไม่รู้ว่าจะใช้วิธีไหน หรือจะใช้วิธีไหนภายใต้สถานการณ์ใด หรือพวกเขาไม่รู้หลักการของทั้งสองอย่าง
1 เชื่อมต่อโดยตรงกับไฟล์ฐานข้อมูล
ตั้งค่า conn = Server.CreateObject (ADODB.Connection)
conn.Open DRIVER={ไดรเวอร์ Microsoft Access (*.mdb)};
②เชื่อมต่อไฟล์ฐานข้อมูลผ่านแหล่งข้อมูล
ตั้งค่า conn = Server.CreateObject (ADODB.Connection)
conn.Open Provider=Microsoft.Jet.OLEDB.4.0; แหล่งข้อมูล=&Server.MapPath(ฐานข้อมูล/yanhang.mdb)
แล้วอันไหนดีกว่ากัน แน่นอนว่าอันที่สองเพราะอันแรกคือเบราว์เซอร์ไคลเอนต์อ่านฐานข้อมูลโดยตรงดังนั้นความปลอดภัยจึงแตกต่างกันมาก ซึ่งขึ้นอยู่กับข้อมูลเซิร์ฟเวอร์ เครื่องมือต้นทางเชื่อมต่ออยู่และไม่เกี่ยวข้องกับไคลเอนต์ ดังนั้นฐานข้อมูลจะไม่ถูกเปิดเผยต่อไคลเอนต์ และปัจจัยด้านความปลอดภัยจะสูงกว่ามาก
การประยุกต์ใช้โปรแกรมที่เกี่ยวข้องกับฐานข้อมูล ACCESS: 1 การเชื่อมต่อโดยตรงกับไฟล์ฐานข้อมูล
conn.Open DRIVER={ไดรเวอร์ Microsoft Access (*.mdb)};
สำหรับวิธีการเชื่อมต่อฐานข้อมูลนี้ ให้เพิ่มคำสั่ง:
set rs=server.createobject(adodb.recordset) '(เขียนถูกต้อง)
rs.open เลือก * จาก dndj,conn,1,3
rs.เพิ่มใหม่
อาร์เอส(บฮ) = บฮ
อาร์เอส(บีเอ็ม) = บีเอ็ม
อาร์เอส(xm) = xm
อาร์เอส(xsq) = xsq
อาร์เอสอัปเดต
RS.ปิด
ตั้งค่า rs=nothing
set rs=server.createobject(adodb.recordset) '(เขียนผิด)
sql=แทรกเข้าไปในค่า dndj(bh,bm,xm,xsq)('bh','bm','xm','xsq')
rs.open sql,conn,1,3
การประยุกต์ใช้โปรแกรมที่เกี่ยวข้องกับฐานข้อมูล ACCESS : 2 เชื่อมต่อไฟล์ฐานข้อมูลผ่านแหล่งข้อมูล
conn.Open Provider=Microsoft.Jet.OLEDB.4.0; แหล่งข้อมูล=&Server.MapPath(ฐานข้อมูล/yanhang.mdb)
สำหรับวิธีการเชื่อมต่อฐานข้อมูลนี้ ให้เพิ่มคำสั่ง:
conn.execute แทรกลงในค่า dndj(bh,bm,xm,xsq)('&bh&','&bm&','&xm&','&xsq&') '(การเขียนที่ถูกต้อง)
set rs=server.createobject(adodb.recordset) '(เขียนผิด)
sql=แทรกเข้าไปในค่า dndj(bh,bm,xm,xsq)('bh','bm','xm','xsq')
rs.open sql,conn,1,3
3. การใช้เครื่องหมายคำพูดคู่
โดยปกติแล้วเราจะเขียนซูเปอร์ลิงก์เช่นนี้ <a href=abc.asp?id=<%=rs(id)%>>ซูเปอร์ลิงก์</a>
แต่จะเกิดอะไรขึ้นถ้าไฮเปอร์ลิงก์นี้ถูกคอมไพล์เป็น asp?
response.write <a href=abc.asp?id=&rs(id)&>Super Connection</a> '(เขียนถูกต้อง)
response.write <a href='abc.asp?id=&rs(id)&'>Super Connection</a> '(เขียนถูกต้อง)
response.write <a href=abc.asp?id=&rs(id)&>Super Connection</a> '(เขียนถูกต้อง)
response.write <a href=abc.asp?id=<%=rs(id)%>>การเชื่อมต่อขั้นสูง</a> '(เขียนผิด)
response.write <a href=abc.asp?id=&rs(id)&>Super Connection</a> '(เขียนผิด)
แบบฟอร์มถูกคอมไพล์เป็น asp <input type=text name=id value=<%rs(id)%> />
response.write <input type=text name=id value=&rs(id)& /> '(การเขียนที่ถูกต้อง) หมายเหตุ: มีเครื่องหมายคำพูดคู่สามอันที่นี่
response.write <input type='text' name='id' value='&rs(id)&' /> '(การเขียนที่ถูกต้อง)
response.write <input type=text name=id value=&rs(id)& /> '(การเขียนที่ถูกต้อง)
response.write <input type=text name=id value=<%=rs(id)%> /> '(เขียนผิด)
response.write <input type=text name=id value=&rs(id)& /> '(เขียนผิด)
กฎพื้นฐานของการเขียนโปรแกรม ASP สำหรับมือใหม่
4. มีหลายวิธีในการป้องกันไม่ให้ดาวน์โหลดฐานข้อมูล ACCESS
ไซต์ไดนามิกหลายแห่งใช้ฐานข้อมูลอย่างกว้างขวาง และฐานข้อมูลก็กลายเป็นไฟล์หลักของไซต์โดยธรรมชาติ เมื่อฐานข้อมูลถูกดาวน์โหลดอย่างผิดกฎหมาย มีแนวโน้มว่าผู้ประสงค์ร้ายจะทำลายเว็บไซต์ หรือขโมยข้อมูล
วิธีการด้านล่างใช้ได้กับผู้ใช้ที่ใช้พื้นที่โฮสต์เสมือนและผู้ใช้ที่มีสิทธิ์ควบคุม IIS!
1: การซื้อพื้นที่โฮสต์เสมือนเหมาะสำหรับผู้ที่ไม่มีการควบคุม IIS
1: ใช้จินตนาการของคุณเพื่อแก้ไขชื่อไฟล์ฐานข้อมูล
นี่คือพื้นฐานที่สุด ฉันคิดว่าคงมีคนขี้เกียจเปลี่ยนชื่อไฟล์ฐานข้อมูลไม่มากนักในตอนนี้ใช่ไหม? สำหรับสิ่งที่จะเปลี่ยนนั้นก็ขึ้นอยู่กับคุณ อย่างน้อยต้องแน่ใจว่าชื่อไฟล์นั้นซับซ้อนและคาดเดาไม่ได้ แน่นอนว่า ในขณะนี้ ไดเร็กทอรีที่ฐานข้อมูลของคุณอยู่ไม่สามารถมีสิทธิ์ในการเรียกดูไดเร็กทอรีได้!
2: เปลี่ยนส่วนต่อท้ายชื่อฐานข้อมูลเป็น ASA, ASP ฯลฯ
ฉันได้ยินมาว่าสิ่งนี้เป็นที่นิยมมาก แต่ฉันได้ทดสอบมาหลายครั้งแล้วและพบว่ามันไม่เหมาะ หากคุณต้องการป้องกันการดาวน์โหลดจริงๆ คุณต้องเพิ่มฟิลด์ไบนารีและการตั้งค่าอื่น ๆ ซับซ้อน (หากฐานข้อมูลของคุณมีจำนวนมาก ถ้าเป็นเช่นนั้นวิธีนี้ไม่ค่อยดีนัก)
3: เพิ่ม # ก่อนชื่อฐานข้อมูล
เพียงเพิ่ม # ไว้ที่ชื่อด้านหน้าของไฟล์ฐานข้อมูล จากนั้นแก้ไขที่อยู่ฐานข้อมูลในไฟล์การเชื่อมต่อฐานข้อมูล (เช่น conn.asp) หลักการคือเมื่อดาวน์โหลดจะจดจำได้เฉพาะส่วนที่อยู่ก่อนเครื่องหมาย # และส่วนต่อไปนี้จะถูกลบออกโดยอัตโนมัติ ตัวอย่างเช่น หากคุณต้องการดาวน์โหลด: http://bbs.bccn.net/date/#123 .mdb (สมมติว่ามีอยู่) ไม่ว่าจะเป็น IE หรือ FLASHGET เป็นต้น สิ่งที่ได้คือ http://bbs.bccn.net/date/index.htm
นอกจากนี้ การรักษาช่องว่างบางส่วนในชื่อไฟล์ฐานข้อมูลยังมีบทบาทคล้ายกัน เนื่องจากลักษณะเฉพาะของโปรโตคอล HTTP สำหรับการแก้ไขที่อยู่ ช่องว่างจะถูกเข้ารหัสเป็น %20 เช่น http://bbs.bccn.net/date /123 456.mdb
เมื่อดาวน์โหลด http://bbs.bccn.net/date/123%20456.mdb ไดเรกทอรีของเราไม่มีไฟล์ 123%20456.mdb เลย ดังนั้นการดาวน์โหลดจึงไม่ถูกต้อง แม้ว่าคุณจะเปิดเผยที่อยู่ฐานข้อมูล แต่โดยทั่วไปผู้อื่นก็ไม่สามารถดาวน์โหลดได้ วิธีที่ดีที่สุดคือใช้ #+space ในทั้งสองวิธี เช่น http : //bbs.bccn.net/date/#123 456.mdb
4: เข้ารหัสฐานข้อมูล
หลังจากใช้ ACCESS เพื่อเปิดฐานข้อมูลของคุณในโหมดเอกสิทธิ์เฉพาะบุคคล ให้ไปที่เครื่องมือ-ความปลอดภัย-ตั้งรหัสผ่านฐานข้อมูล และแก้ไขหน้าการเชื่อมต่อฐานข้อมูลหลังจากการเข้ารหัส เช่น:
ไดรเวอร์ conn.open={ไดรเวอร์การเข้าถึง Microsoft (*.mdb)};uid=admin;pwd=รหัสผ่านฐานข้อมูล;dbq=เส้นทางฐานข้อมูล
หลังจากการแก้ไขนี้ แม้ว่าฐานข้อมูลจะถูกดาวน์โหลดแล้ว แต่ผู้อื่นก็ไม่สามารถเปิดได้ (โดยที่รหัสผ่านในหน้าการเชื่อมต่อฐานข้อมูลของคุณไม่รั่วไหล)
แต่เป็นที่น่าสังเกตว่าเนื่องจากกลไกการเข้ารหัสของฐานข้อมูล Access นั้นค่อนข้างง่าย แม้ว่าจะตั้งรหัสผ่านไว้ การถอดรหัสจึงเป็นเรื่องง่าย ระบบฐานข้อมูลจะสร้างสตริงที่เข้ารหัสโดยการ XOR รหัสผ่านที่ผู้ใช้ป้อนด้วยคีย์คงที่ และจัดเก็บไว้ในพื้นที่ของไฟล์ *.mdb โดยเริ่มจากที่อยู่ &H42 ดังนั้นโปรแกรมเมอร์ที่ดีจึงสามารถสร้างโปรแกรมขนาดเล็กที่มีบรรทัดหลายสิบบรรทัดเพื่อรับรหัสผ่านของฐานข้อมูล Access ได้อย่างง่ายดาย ดังนั้นตราบใดที่ฐานข้อมูลถูกดาวน์โหลด ความปลอดภัยของฐานข้อมูลก็ยังไม่ทราบ
สอง: มีการควบคุมโฮสต์ (แน่นอนว่าการตั้งค่าพื้นที่เสมือนยังสามารถใช้ได้ที่นี่)
5: ฐานข้อมูลถูกวางไว้นอกไดเร็กทอรี WEB
หากไดเร็กทอรี WEB ของคุณคือ e:/webroot คุณสามารถใส่ฐานข้อมูลในโฟลเดอร์ e:/data และไปที่หน้าการเชื่อมต่อฐานข้อมูลใน e:/webroot
แก้ไขที่อยู่การเชื่อมต่อฐานข้อมูลในรูปแบบ: ../data/#123 456.mdb เพื่อให้เรียกฐานข้อมูลได้ตามปกติ แต่ไม่สามารถดาวน์โหลดได้เนื่องจากไม่ได้อยู่ในไดเรกทอรี WEB! โดยทั่วไปวิธีนี้เหมาะสำหรับผู้ใช้ที่ซื้อพื้นที่เสมือน
6: ใช้แหล่งข้อมูล ODBC
ในการเขียนโปรแกรมเช่น ASP คุณควรลองใช้แหล่งข้อมูล ODBC และอย่าเขียนชื่อฐานข้อมูลในโปรแกรม มิฉะนั้น ชื่อฐานข้อมูลจะหายไปพร้อมกับการรักษาความลับของซอร์สโค้ด ASP
ตัวอย่างเช่น:
ไดรเวอร์ conn.open={ไดรเวอร์ Microsoft Access (*.mdb)};dbq=&Server.MapPath(../123/abc/asfadf.mdb)
จะเห็นได้ว่าไม่ว่าชื่อฐานข้อมูลจะแปลกแค่ไหน ไม่ว่าไดเร็กทอรีที่ซ่อนอยู่จะลึกแค่ไหน หลังจากที่ซอร์สโค้ด ASP ถูกบุกรุก ก็สามารถดาวน์โหลดได้อย่างง่ายดาย
หากคุณใช้แหล่งข้อมูล ODBC จะไม่มีปัญหาดังกล่าว: ชื่อ conn.open ODBC-DSN แต่จะน่ารำคาญกว่านี้หากย้ายไดเรกทอรี จะต้องรีเซ็ตแหล่งข้อมูล!
7: เพิ่มการแมปเพิ่มเติมของชื่อฐานข้อมูล เช่น MDB
วิธีนี้ทำได้โดยการปรับเปลี่ยนการตั้งค่า IIS เหมาะสำหรับเพื่อนที่มีการควบคุม IIS แต่ไม่เหมาะสำหรับผู้ใช้ที่ซื้อโฮสต์เสมือน (เว้นแต่ผู้ดูแลระบบจะตั้งค่าไว้) ฉันคิดว่าวิธีนี้ดีที่สุดในปัจจุบัน ด้วยการเปลี่ยนแปลงเพียงครั้งเดียว ฐานข้อมูลทั้งหมดของเว็บไซต์ก็สามารถป้องกันไม่ให้ดาวน์โหลดได้ สามารถป้องกันการดาวน์โหลดได้แม้ว่าที่อยู่เป้าหมายจะถูกเปิดเผยโดยไม่ต้องแก้ไขโค้ดก็ตาม
ตั้งค่า:
เพิ่มการแยกวิเคราะห์แอปพลิเคชันของไฟล์ .mdb ในคุณสมบัติ IIS --- โฮมไดเร็กทอรี --- การกำหนดค่า --- การแมป --- ส่วนขยายแอปพลิเคชัน โปรดทราบว่า DLL (หรือ EXE ฯลฯ) ที่เลือกไว้ที่นี่ดูเหมือนจะไม่เหมาะสม หากการเลือกนั้นไม่เหมาะสม คุณยังคงดาวน์โหลดไฟล์ MDB ได้ โปรดทราบว่าทางที่ดีที่สุดคืออย่าเลือก asp.dll เป็นต้น คุณสามารถทดสอบได้ด้วยตัวเอง
หลังจากการปรับเปลี่ยนนี้ ให้ดาวน์โหลดฐานข้อมูล เช่น: http://bbs.bccn.net/data/dvbbs6.mdb มันจะปรากฏขึ้น (ข้อผิดพลาดเช่น 404 หรือ 500)
8: ข้อดีของการใช้ .net
Mu Niao จาก Dongwang ได้เขียนเครื่องมือป้องกันฮอตลิงก์ WBAL เพื่อป้องกันการดาวน์โหลดไฟล์อย่างผิดกฎหมาย ฉันจำได้ว่าผู้เชี่ยวชาญในฟอรัมนี้เคยเผยแพร่ปลั๊กอินป้องกันการดาวน์โหลดฐานข้อมูล ซึ่งเป็นไฟล์ .dll ที่โหลดลงใน IIS
อย่างไรก็ตาม สิ่งนั้นเพียงป้องกันการดาวน์โหลดที่ไม่ใช่ในเครื่องเท่านั้น และไม่มีฟังก์ชันป้องกันการดาวน์โหลดฐานข้อมูลอย่างแท้จริง แต่วิธีนี้คล้ายกับวิธีที่ 5
คุณสามารถแก้ไขไฟล์ .NET เพื่อไม่ให้ดาวน์โหลดในเครื่องได้!
ในบรรดาวิธีการเหล่านี้ มีเพียงวิธีที่ 7 และ 8 เท่านั้นที่สามารถเปลี่ยนได้อย่างสม่ำเสมอ หลังจากแก้ไขการกำหนดค่าหนึ่งครั้ง ฐานข้อมูลของทั้งไซต์สามารถป้องกันไม่ให้ดาวน์โหลดได้ อีกหลายวิธีจำเป็นต้องแก้ไขชื่อฐานข้อมูลและไฟล์การเชื่อมต่อตามลำดับ ซึ่งก็คือ ลำบากกว่าแต่สำหรับเพื่อนโฮสต์เสมือนทำได้แค่นี้!
ที่จริงแล้ว วิธีที่ 6 ควรเป็นส่วนเสริมของวิธีที่ 5 ซึ่งสามารถบรรลุฟังก์ชันพิเศษได้ อย่างไรก็ตาม สำหรับโฮสต์ที่ไม่รองรับ .net หรือกลัวการตั้งค่าที่ยุ่งยาก ควรใช้วิธีที่ 5 โดยตรง และ วิธีที่ 6 จะใช้โดยค่าเริ่มต้น วิธีที่ 1 คุณยังสามารถเผยแพร่ได้โดยการคัดลอกและเชื่อมต่อกับฟอรัมหรือสมุดเยี่ยมของโฮสต์เดียวกัน จากนั้นคลิกเพื่อดาวน์โหลด (เนื่องจากหน้าอ้างอิงดังกล่าวมาจากโฮสต์เดียวกัน)
แต่ละวิธีมีข้อดีและข้อเสียของตัวเอง ดังนั้นโปรดเลือกใช้อย่างเฉพาะเจาะจง วิธีการเหล่านี้ไม่ปลอดภัยอย่างแน่นอน ผู้ดูแลเว็บไซต์ยังต้องใส่ใจกับความปลอดภัยของระบบบางระบบและความปลอดภัยของการเขียนโค้ด ASP ด้วย มิฉะนั้น อาจมีคนดาวน์โหลดหรือแก้ไขฐานข้อมูลได้!