ASP編程菜鳥易犯的(de)一個錯誤
在ASP編程中,身份認證(zhèng)可以說是常要(yào)用到(dào)的。但怎麽(me)樣才能做到(dào)認證的安全呢(ne)?
表(biǎo)單提交頁麵:sub.htm
<html>
以下為引用的內(nèi)容:
<head>
<title>管(guǎn)理員(yuán)登陸</title>
<body>
<form name="form1" method="post" action="sub.asp">
<p> 管理(lǐ)員:
<input type="text" name="UserID" size="25" maxlength="20">
密 碼:
<input type="text" name="Pass" size="12" maxlength="20">
<input type="submit" name="Submit" value="提交">
</p>
</form>
</body>
</html>
以下為引用的(de)內容(róng): SUB.asp程序 <% 接收表單中的數據 user=request.from("UserID") 檢察表單(dān)提交的(de)數據是否為空(表單頁麵可能你(nǐ)用JAVASCRIPT OR VBSCRIPT控製了(le),但這裏也不要忘記控製(zhì)! if user="" then 轉到出錯提示頁麵! response.redirect "err1.htm" 這一句可能沒(méi)用,但(dàn)加上(shàng)為好(hǎo)! response.end end if pass=request.from("Pass") if pass="" then response.redirect "err2.htm" response.end end if 聯接數(shù)據庫 file=server.mappath("你(nǐ)的數據庫(kù)") set conn=server.createobject("adodb.connection") dr="driver={microsoft access driver (*.mdb)};dbq="&file conn.open dr set rs=server.createobject("adodb.recordset") 關鍵是這裏的SQL語(yǔ)言 sql="select * from 表 where user= "&user&" and pass= "&pass&" " rs.open sql if not rs.eof then 找到的話就進入管理頁麵 reponse.redirect "login.asp" else 沒找到就(jiù)進入錯誤頁麵 response.write "err3.htm" end if %> |
大(dà)家感覺以上代碼應該沒問題啊,但是這裏有一個嚴重的安全隱患:
我如(rú)果想(xiǎng)登錄(lù)管理員的(de)話可以在SUb.htm表單輸入(rù)框中輸入(rù):
第一個文本框中輸入:a or 1 = 1 或 OR =
第二個文本框中輸入:a or 1 = 1 或 OR =
提(tí)交,大家會(huì)看到...“嗚,聽(tīng)我說完好不好,磚頭一會再丟過來..."
"a " 和“1”為任意字(zì)符
有人會問為什麽你輸入這些字符會(huì)以管(guǎn)理員身(shēn)份進入呢??
其實這些(xiē)字(zì)符是對你程序中(zhōng)SQL語言的(de)欺騙(piàn),而成功進入的
大(dà)家看(kàn):開始程序SQL中是(shì)對(duì)表進行查詢滿(mǎn)足user= "&user&" and pass= "&pass&" "條件的記錄
sql="select * from 表 where user= "&user&" and pass= "&pass&" "
我(wǒ)而輸入上麵的代碼後就成了:
sql="select * from 表 where user= a or 1 = 1 and pass= a or 1 = 1 "
大(dà)家看看,能有不進入(rù)的理由嗎??給(gěi)我一(yī)個不進(jìn)入的理(lǐ)由,先!
以上USER PASS字段(duàn)為字符型(xíng) 如果是數字型也一樣的道(dào)理!
解(jiě)決方法:
一、函(hán)數替(tì)代法:
用REPLACE將(jiāng)用戶端輸入的內(nèi)容中含有特殊(shū)字符進行替換,達到控製目的啊!sql="select * from 表(biǎo) where user= "&replace(user," "," ")&" and pass= "&replace(pass," "," ")&" "
這種方法每次隻能替(tì)換(huàn)一個字(zì)符(fú),其實危險的字符不隻是" ",還有如">"、"<"、"&"、"%"等字符應(yīng)該(gāi)全控製起來。但用(yòng)REPLACE函數好象不太(tài)勝任那怎麽辦呢??
二、程序控製法
用(yòng)程序來對客戶端輸入的內容全部控製起來,這樣能全(quán)麵控製用戶(hù)端輸入的任何可能的(de)危險字符或(huò)代碼,我就(jiù)的這(zhè)個方法!
以下為引(yǐn)用的內容: <% 捕捉用戶(hù)端提交的表單(dān)內容 user=request.from("user") pass=request.from("pass") ... 循環控(kòng)製(zhì)開始 for i=1 to len(user) 用MID函(hán)數讀出變量user中i 位(wèi)置的(de)一個字符 us=mid(user,i,1) 將(jiāng)讀出的字符進(jìn)行比較 if us=" " or us="%" or us="<" or us=">" or us="&" then 如果含有(yǒu)以上字符將出錯(cuò)提示,不(bú)能含有以(yǐ)上特殊(shū)字(zì)符 response.redirect "err2.htm" response.end end if next ... %> |
關鍵詞(cí):ASP編(biān)程
閱(yuè)讀(dú)本文(wén)後您有(yǒu)什麽感想? 已有 人(rén)給出評價!
- 1
- 1
- 1
- 1
- 1
- 1