綠色資源網:您(nín)身邊最(zuì)放心的(de)安全下載站! 最(zuì)新軟件|熱(rè)門排行|軟件(jiàn)分(fèn)類(lèi)|軟件專(zhuān)題|廠(chǎng)商大全

綠(lǜ)色(sè)資源網

技術教程
您的位置:首頁網絡編程Asp編(biān)程(chéng) → 初學ASP編程易犯的一個(gè)錯誤要(yào)注(zhù)意

初學ASP編(biān)程易(yì)犯的一個錯誤要(yào)注意

我要(yào)評論 2009/06/20 21:29:59 來源:綠色資(zī)源網(wǎng) 編輯:編輯整理(lǐ) [ ] 評論:0 點擊:291次

在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 歡(huān)迎喜歡
  • 0 白癡
  • 0 拜托
  • 0 哇
  • 0 加(jiā)油
  • 0 鄙視(shì)