一、步骤叙述:
1、数据库文件mysite.mdb,其中两个表:admininfo(表示治理员的记录表)和memberinfo(普通用户的记录表)
2、普通用户登陆页 login.asp ,添加服务器行为时候,选择基于用户名和密码的访问。即表示产生了 session("mm_username") (其值即为当前正确登陆的用户名)。因为此时为选择访问级别,所以代表访问级别的 session("mm_userauthorization") = ""
3、普通用户登陆成功页 personal.asp,服务器行为“限制对页访问”同样设置为用户名和密码的访问。实质是判定session,即可实现“限制对页的访问”。
以上2→3均能正常,接着就开始出现问题了。
4、治理员登陆页 adminlogin.asp ,添加服务器行为时候,选择基于用户名、密码和访问级别的访问(当然这要求admininfo表中必须具有表示访问级别的字段)。生成session("mm_username") (其值即为当前正确登陆的治理员名),同时生成表示访问级别的session("mm_userauthorization") = cstr(mm_rsuser.fields.item(mm_flduserauthorization).value)
5、治理员登陆正确页 admin.asp,很显然,服务器行为“限制对页访问”必须选择“用户名、密码和访问权限的访问”,级别的定义值即是admininfo表中表示访问级别字段的值。同样也能实现“限制对页的访问”。
二、bug来了
1、普通用户登陆。
2、正确登陆。
3、将url地址直接切换为“admin.asp”的地址。
4、完全可访问。
注:在admin.asp提取session("mm_userauthorization") 是为空值,而当从adminlogin.asp正确登陆到adming.asp提取session("mm_userauthorization") 值为数据库表中相应字段的值
得出结论:代表权限的访问级别没有起效。session("mm_userauthorization") 针对同一站点同一数据库不同表时——形同虚设!
三、原理分析
在治理员登陆成功页中,有如下代码是用来进行“限制对页访问的”
' *** 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,当然,其中还有嵌套if。
if (false or cstr(session("mm_userauthorization"))="") or (instr(1,mm_authorizedusers,session("mm_userauthorization"))>=1) then
因为mm_authorizedusers="administrator",这里的"administrator"是级别的定义值,即是admininfo表中表示访问级别字段的值
所以,其只能限制admininfo表其他的访问级别(非administrator)的治理员的访问,而对于普通会员而言,其session("mm_userauthorization")值为空,同样可访问该权限页面。
这就是bug所在!
四、目前解决方案
1、要做基于用户名、密码和访问级别的访问,必须是同一数据库表中的。即将普通会员和治理员的信息都保存在同一表中,区分他们权限的方法即是添加一个代表权限的字段,使得他们具有不同的值。
当然,这不是很完整的,很多情况需要将两个表分开,那么则可以用如下方法:
2、当基于用户名、密码和访问级别的访问,在代码 |||
if session
("mm_username") <> "" then
继续添加内容
and session("mm_userauthorization") <> "" ,即最后为:
if session("mm_username") <> "" and session
("mm_userauthorization") <> "" then
注重:当基于用户名、密码和访问级别的访问时,才可以修改(因为有访问级别,就表示有session("mm_userauthorization") );而只当基于用户名和的访问时,则不需要。
五、最后的建议
当然,这个建议最好给mm公司,即是:当基于用户名、密码和访问级别的访问时,代码判定行和当基于用户名和的访问时,要不一样,应该是:
if session("mm_username") <> "" and session
("mm_userauthorization") <> "" then
新闻热点
疑难解答