一、步驟敘述:
1、數(shù)據(jù)庫文件mysite.mdb,其中兩個(gè)表:admininfo(表示治理員的記錄表)和memberinfo(普通用戶的記錄表)
2、普通用戶登陸頁 login.asp ,添加服務(wù)器行為時(shí)候,選擇基于用戶名和密碼的訪問。即表示產(chǎn)生了 session("mm_username") (其值即為當(dāng)前正確登陸的用戶名)。因?yàn)榇藭r(shí)為選擇訪問級別,所以代表訪問級別的 session("mm_userauthorization") = ""
3、普通用戶登陸成功頁 personal.asp,服務(wù)器行為“限制對頁訪問”同樣設(shè)置為用戶名和密碼的訪問。實(shí)質(zhì)是判定session,即可實(shí)現(xiàn)“限制對頁的訪問”。
以上2→3均能正常,接著就開始出現(xiàn)問題了。
4、治理員登陸頁 adminlogin.asp ,添加服務(wù)器行為時(shí)候,選擇基于用戶名、密碼和訪問級別的訪問(當(dāng)然這要求admininfo表中必須具有表示訪問級別的字段)。生成session("mm_username") (其值即為當(dāng)前正確登陸的治理員名),同時(shí)生成表示訪問級別的session("mm_userauthorization") = cstr(mm_rsuser.fields.item(mm_flduserauthorization).value)
5、治理員登陸正確頁 admin.asp,很顯然,服務(wù)器行為“限制對頁訪問”必須選擇“用戶名、密碼和訪問權(quán)限的訪問”,級別的定義值即是admininfo表中表示訪問級別字段的值。同樣也能實(shí)現(xiàn)“限制對頁的訪問”。
二、bug來了
1、普通用戶登陸。
2、正確登陸。
3、將url地址直接切換為“admin.asp”的地址。
4、完全可訪問。
注:在admin.asp提取session("mm_userauthorization") 是為空值,而當(dāng)從adminlogin.asp正確登陸到adming.asp提取session("mm_userauthorization") 值為數(shù)據(jù)庫表中相應(yīng)字段的值
得出結(jié)論:代表權(quán)限的訪問級別沒有起效。session("mm_userauthorization") 針對同一站點(diǎn)同一數(shù)據(jù)庫不同表時(shí)——形同虛設(shè)!
三、原理分析
在治理員登陸成功頁中,有如下代碼是用來進(jìn)行“限制對頁訪問的”
' *** restrict access to page: grant or deny access to this page
mm_authorizedusers="administrator"
mm_authfailedurl="adminlogin.asp"
mm_grantaccess=false
if session("mm_username") <> "" then
if (false or cstr(session("mm_userauthorization"))="") or _
(instr(1,mm_authorizedusers,session("mm_userauthorization"))>=1) then
mm_grantaccess = true
end if
end if
if session("mm_username") <> "" then
假如表示用戶的session不為空,即可mm_grantaccess = true,當(dāng)然,其中還有嵌套if。
if (false or cstr(session("mm_userauthorization"))="") or (instr(1,mm_authorizedusers,session("mm_userauthorization"))>=1) then
因?yàn)閙m_authorizedusers="administrator",這里的"administrator"是級別的定義值,即是admininfo表中表示訪問級別字段的值
所以,其只能限制admininfo表其他的訪問級別(非administrator)的治理員的訪問,而對于普通會(huì)員而言,其session("mm_userauthorization")值為空,同樣可訪問該權(quán)限頁面。
這就是bug所在!
四、目前解決方案
1、要做基于用戶名、密碼和訪問級別的訪問,必須是同一數(shù)據(jù)庫表中的。即將普通會(huì)員和治理員的信息都保存在同一表中,區(qū)分他們權(quán)限的方法即是添加一個(gè)代表權(quán)限的字段,使得他們具有不同的值。
當(dāng)然,這不是很完整的,很多情況需要將兩個(gè)表分開,那么則可以用如下方法:
2、當(dāng)基于用戶名、密碼和訪問級別的訪問,在代碼 |||
if session
("mm_username") <> "" then
繼續(xù)添加內(nèi)容
and session("mm_userauthorization") <> "" ,即最后為:
if session("mm_username") <> "" and session
("mm_userauthorization") <> "" then
注重:當(dāng)基于用戶名、密碼和訪問級別的訪問時(shí),才可以修改(因?yàn)橛性L問級別,就表示有session("mm_userauthorization") );而只當(dāng)基于用戶名和的訪問時(shí),則不需要。
五、最后的建議
當(dāng)然,這個(gè)建議最好給mm公司,即是:當(dāng)基于用戶名、密碼和訪問級別的訪問時(shí),代碼判定行和當(dāng)基于用戶名和的訪問時(shí),要不一樣,應(yīng)該是:
if session("mm_username") <> "" and session
("mm_userauthorization") <> "" then
新聞熱點(diǎn)
疑難解答