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