的洞的。)。
一般來說,我們在驗證用戶是否合法時,會用如下的語句:
set db=server.CreateObject("ADOdb.recordset")
sqlstr=select * from table where user='"&request("user")&"' and password='"&request("password")&"'"
db.open sqlstr,"DSN=aa;",1然后檢測得到的表是否為空,如果為空則用戶非法,如果不為空則用戶是合法的。
if db.eof and db.bof then
ok="no"
else
ok="yes"
end if這段程序單從技術角度看規范的,但從安全角度看就存在一個非常大的洞。因為我們可以構造一個特殊的用戶
口令和用戶名從而進入受保護的系統內部。
user='aa' or user<>'aa'
password='aa' or password<>'aa'
相應的在瀏覽器端的用戶名框內寫入:aa' or user<>'aa
口令框內寫入:aa' or password<>'aa,注意這兩個字符串兩頭是沒有'的。
這樣就可以成功的騙過系統而進入。
理論雖然如此,但要實踐是非常困難的,下面兩個條件都必須具備。
1.你首先要能夠準確的知道系統在表中是用哪兩個字段存儲用戶名和口令的,只有這樣你才能準確的構造出這個進攻
性的字符串。實際上這是很難猜中的。
2.系統對你輸入的字符串不進行有效性檢查。
從這兒可以看出源碼泄露的漏洞有時是致命的!!
我想出的解決辦法:
1.就象yexiaolu所說的,分開寫,可以看看他的貼子。
2.將存儲用戶名和用戶口令的字段取兩個毫不相干的名字,讓攻擊者猜不中。
3.對用戶輸入的數據進入有效性檢查,如替換掉'等。
4.可以考慮對口令進行簡單的加密,如將輸入的口令字符串變換一下字符串中字符的位置等都可以有效的防止這種進
攻。
5.最重要的一點,不要泄露你的源碼!!!!