綠色(sè)資源網:您身邊最放心的安全下載站! 最新(xīn)軟(ruǎn)件(jiàn)|熱門(mén)排行(háng)|軟件分類|軟件專題|廠商大全(quán)

綠(lǜ)色資(zī)源網(wǎng)

技(jì)術教程
您的位置:首頁網(wǎng)絡(luò)編程Asp編程 → ASP編程(chéng)菜鳥易犯的一個錯誤

ASP編程菜鳥易犯的(de)一個錯誤

我要(yào)評論 2009/07/07 19:45:46 來源:綠色資源網(wǎng) 編輯:編輯整理 [ 中(zhōng) ] 評論:0 點擊(jī):492次

在ASP編程中,身份認證(zhèng)可以說是常要(yào)用到(dào)的。但怎麽(me)樣才能做到(dào)認證的安全呢(ne)?

表(biǎo)單提交頁麵:sub.htm 

以下為引用的內(nèi)容:

<html>
    <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 歡迎(yíng)喜歡
  • 1 白(bái)癡
  • 1 拜托(tuō)
  • 1 哇
  • 1 加(jiā)油
  • 1 鄙視(shì)