Dreamweaver 限制访问的BUG (1)
<P><STRONG>一、步骤叙述:</STRONG></P><P><STRONG></STRONG>1、文件mysite.mdb,其中两个表:admininfo(表示管理员的记录表)和memberinfo(普通用户的记录表)</P><P>2、普通用户登陆页 login.asp ,添加行为时候,选择基于用户名和密码的访问。即表示产生了 Session("MM_Username") (其值即为当前正确登陆的用户名)。因为此时为选择访问级别,所以代表访问级别的 Session("MM_UserAuthorization") = ""</P><P>3、普通用户登陆成功页 personal.asp,服务器行为“限制对页访问”同样设置为用户名和密码的访问。实质是判断Session,即可实现“限制对页的访问”。</P><P>以上2→3均能正常,接着就开始出现问题了。</P><P>4、管理员登陆页 adminlogin.asp ,添加服务器行为时候,选择基于用户名、密码和访问级别的访问(当然这要求admininfo表中必须具有表示访问级别的字段)。生成Session("MM_Username") (其值即为当前正确登陆的管理员名),同时生成表示访问级别的Session("MM_UserAuthorization") = CStr(MM_rsUser.Fields.Item(MM_fldUserAuthorization).Value)</P><P>5、管理员登陆正确页 admin.asp,很显然,服务器行为“限制对页访问”必须选择“用户名、密码和访问权限的访问”,级别的定义值即是admininfo表中表示访问级别字段的值。同样也能实现“限制对页的访问”。</P><P><B>二、BUG来了</B></P><P>1、普通用户登陆。<BR>2、正确登陆。<BR>3、将URL地址直接切换为“admin.asp”的地址。<BR>4、完全可访问。</P><P>注:在admin.asp提取Session("MM_UserAuthorization") 是为空值,而当从adminlogin.asp正确登陆到adming.asp提取Session("MM_UserAuthorization") 值为数据库表中相应字段的值</P><P>得出结论:代表权限的访问级别没有起效。Session("MM_UserAuthorization") 针对同一站点同一数据库不同表时——形同虚设!</P><P><B>三、原理分析</B></P><P>在管理员登陆成功页中,有如下代码是用来进行“限制对页访问的”</P><P>' *** Restrict Access To Page: Grant or deny access to this page<BR>MM_authorizedUsers="administrator"<BR>MM_authFailedURL="adminlogin.asp"<BR>MM_grantAccess=false<BR>If Session("MM_Username") <> "" Then<BR>If (false Or CStr(Session("MM_UserAuthorization"))="") Or _<BR> (InStr(1,MM_authorizedUsers,Session("MM_UserAuthorization"))>=1) Then<BR> MM_grantAccess = true<BR>End If<BR>End If</P><P></P><P><B>If Session("MM_Username") <> "" Then</B></P><P>如果表示用户的Session不为空,即可MM_grantAccess = true,当然,其中还有嵌套IF。</P></p><p align='center'><b><font color='red'></font> <a href='/news/news001/dreamweaver/200510/20051016193912_2.html'></a> <a href='/news/news001/dreamweaver/200510/20051016193912_2.html'></a></b></p><P><STRONG>一、步骤叙述:</STRONG></P><P><STRONG></STRONG>1、文件mysite.mdb,其中两个表:admininfo(表示管理员的记录表)和memberinfo(普通用户的记录表)</P><P>2、普通用户登陆页 login.asp ,添加行为时候,选择基于用户名和密码的访问。即表示产生了 Session("MM_Username") (其值即为当前正确登陆的用户名)。因为此时为选择访问级别,所以代表访问级别的 Session("MM_UserAuthorization") = ""</P><P>3、普通用户登陆成功页 personal.asp,服务器行为“限制对页访问”同样设置为用户名和密码的访问。实质是判断Session,即可实现“限制对页的访问”。</P><P>以上2→3均能正常,接着就开始出现问题了。</P><P>4、管理员登陆页 adminlogin.asp ,添加服务器行为时候,选择基于用户名、密码和访问级别的访问(当然这要求admininfo表中必须具有表示访问级别的字段)。生成Session("MM_Username") (其值即为当前正确登陆的管理员名),同时生成表示访问级别的Session("MM_UserAuthorization") = CStr(MM_rsUser.Fields.Item(MM_fldUserAuthorization).Value)</P><P>5、管理员登陆正确页 admin.asp,很显然,服务器行为“限制对页访问”必须选择“用户名、密码和访问权限的访问”,级别的定义值即是admininfo表中表示访问级别字段的值。同样也能实现“限制对页的访问”。</P><P><B>二、BUG来了</B></P><P>1、普通用户登陆。<BR>2、正确登陆。<BR>3、将URL地址直接切换为“admin.asp”的地址。<BR>4、完全可访问。</P><P>注:在admin.asp提取Session("MM_UserAuthorization") 是为空值,而当从adminlogin.asp正确登陆到adming.asp提取Session("MM_UserAuthorization") 值为数据库表中相应字段的值</P><P>得出结论:代表权限的访问级别没有起效。Session("MM_UserAuthorization") 针对同一站点同一数据库不同表时——形同虚设!</P><P><B>三、原理分析</B></P><P>在管理员登陆成功页中,有如下代码是用来进行“限制对页访问的”</P><P>' *** Restrict Access To Page: Grant or deny access to this page<BR>MM_authorizedUsers="administrator"<BR>MM_authFailedURL="adminlogin.asp"<BR>MM_grantAccess=false<BR>If Session("MM_Username") <> "" Then<BR>If (false Or CStr(Session("MM_UserAuthorization"))="") Or _<BR> (InStr(1,MM_authorizedUsers,Session("MM_UserAuthorization"))>=1) Then<BR> MM_grantAccess = true<BR>End If<BR>End If</P><P></P><P><B>If Session("MM_Username") <> "" Then</B></P><P>如果表示用户的Session不为空,即可MM_grantAccess = true,当然,其中还有嵌套IF。</P></p><p align='center'><b><font color='red'></font> <a href='/news/news001/dreamweaver/200510/20051016193912_2.html'></a> <a href='/news/news001/dreamweaver/200510/20051016193912_2.html'></a></b></p>
<P><B>If (false Or CStr(Session("MM_UserAuthorization"))="") Or (InStr(1,MM_authorizedUsers,Session("MM_UserAuthorization"))>=1) Then</B></P><P>因为MM_authorizedUsers="administrator",这里的"administrator"是级别的定义值,即是admininfo表中表示访问级别字段的值</P><P>所以,其只能限制admininfo表的访问级别(非administrator)的管理员的访问,而对于普通会员而言,其Session("MM_UserAuthorization")值为空,同样可访问该权限页面。</P><P>这就是BUG所在!</P><P><B>四、目前解决方案</B></P><P>1、要做基于用户名、密码和访问级别的访问,必须是同一数据库表中的。即将普通会员和管理员的信息都保存在同一表中,区分他们权限的方法即是添加一个代表权限的字段,使得他们具有不同的值。</P><P>当然,这不是很完整的,很多情况需要将两个表分开,那么则可以用如下方法:</P><P>2、当基于用户名、密码和访问级别的访问,在代码 </P><P>If Session</P><P>("MM_Username") <> "" Then </P><P>继续添加内容</P><P>and Session("MM_UserAuthorization") <> "" ,即最后为:</P><P>If Session("MM_Username") <> "" and Session</P><P>("MM_UserAuthorization
页:
[1]