明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

在ASP程序中執(zhí)行SQL語句的安全問題

[摘要]在ASP程序中,如果我們的程序設(shè)計(jì)不當(dāng),就有可能面臨數(shù)據(jù)庫被別人控制的危險(xiǎn)以下是一個簡單的用戶更改密碼的代碼---------------------username=request("u...
在ASP程序中,如果我們的程序設(shè)計(jì)不當(dāng),就有可能面臨數(shù)據(jù)庫被別人控制的危險(xiǎn)

以下是一個簡單的用戶更改密碼的代碼
---------------------
username=request("user_name")
pwd=request("pwd")
username=replace(username,"'","''")
pwd=replace(pwd,"'","''")
sql="update tbl_test set pwd='" & pwd & "' where uid='" & username & "'"
set rs=conn.execute (sql)

--------------
現(xiàn)在,假如我注冊一個用戶,用戶名為 aa'; exec sp_addlogin 'haha

當(dāng)該用戶更改密碼時(shí)(假設(shè)改為pp),會出現(xiàn)什么后果呢??

sql變?yōu)?nbsp;update tbl_test set pwd='pp' where uid='aa' ; exec sp_addlogin 'haha'

結(jié)果是用戶密碼沒有被修改,因?yàn)闆]有 aa這個用戶,
但在你的數(shù)據(jù)庫中創(chuàng)建了一個登陸,新登陸名為 haha

將用戶名稍加修改,實(shí)際上可以運(yùn)行任何sql語句,任何sql系統(tǒng)過程
而這一切都在你不知情的情況下發(fā)生的,實(shí)際上,上面的只是一個

示范,稍微修改一下用戶名,我們可以做添加一個DBA賬號,刪除所

有紀(jì)錄,讀取用戶密碼等越權(quán)操作。

 

 解決的辦法:

在你使用參數(shù)前,對參數(shù)進(jìn)行嚴(yán)格檢驗(yàn),尤其是用戶輸入的參數(shù)

不但要對其數(shù)據(jù)類型,長度進(jìn)行檢查,還要對其內(nèi)容進(jìn)行檢查。


我們再看一段代碼。(用戶登陸)

username=request("user_name")
pwd=request("pwd")
username=replace(username,"'","''")
pwd=replace(pwd,"'","''")

sql="select uid,pwd from account where  uid='" & username & "'  and pwd='" & pwd "'"
rs.open sql,conn,1,1
if not rs.eof then
response.write  rs(0) & "歡迎您,您已登陸成功"
else
response.write  "登陸失敗,錯誤的用戶名或密碼"
end if
............
以上程序的漏洞是顯而易見的 
我們可以以          用戶名:   admin       密碼:   a' or '1'='1
輕易以admin的賬號登陸系統(tǒng)
因?yàn)槲覀兊膕ql 變?yōu)榱?br>select uid,pwd from account where  uid='admin' and pwd='a' or '1'='1'
顯然 uid='admin' and pwd='a' or '1'='1'是恒為成立的所以  rs.eof 為false

正確的寫法應(yīng)為
sql="select uid,pwd from account where  uid='" & username & "'  and pwd='" & pwd "'"
rs.open sql,conn,1,1
if rs(0)=username and rs(1)=pwd then
response.write  rs(0) & "歡迎您,您已登陸成功"
else
response.write  "登陸失敗,錯誤的用戶名或密碼"
end if

 

----全文完--------