Dreamweaver用户身份验证的BUG

时间:2012.07.11频道:Dreamweaver

Dreamweaver用户身份验证(限制对页访问)的BUG 一,步骤叙述: 1,数据库文档mysite.mdb,其中两个表:admininfo(表示管理员的记录表)和memberinfo(普通用户的记录表) 2,普通用户登陆页login.asp,添加服务器行为时候,选择基于用户名和密码的访问。即


  Dreamweaver用户身份验证(限制对页访问)的BUG

  一,步骤叙述:

  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")针对同一站点同一数据库不同表时――形同虚设!

  三、原理分析

  在管理员登陆成功页中,有如下代码是用来进行“限制对页访问的”
  

  '***RestrictAccessToPage:Grantordenyaccesstothispage

  MM_authorizedUsers="administrator"

  MM_authFailedURL="adminlogin.asp"

  MM_grantAccess=false

  IfSession("MM_Username")<>""Then

  If(falseOrCStr(Session("MM_UserAuthorization"))="")Or_

  (InStr(1,MM_authorizedUsers,Session("MM_UserAuthorization"))>=1)Then

  MM_grantAccess=true

  EndIf

  EndIf

  

  IfSession("MM_Username")<>""Then

  假如表示用户的Session不为空,即可MM_grantAccess=true,当然,其中更有嵌套IF。

  If(falseOrCStr(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,当基于用户名、密码和访问级别的访问,在代码IfSession("MM_Username")<>""Then继续添加内容andSession("MM_UserAuthorization")<>"",即最后为:

  IfSession("MM_Username")<>""andSession("MM_UserAuthorization")<>""Then

  注意:当基于用户名、密码和访问级别的访问时,才能够修改(因为有访问级别,就表示有Session("MM_UserAuthorization"));而只当基于用户名和的访问时,则无需。

  五、最后的建议

  当然,这个建议最好给MM公司,即是:当基于用户名、密码和访问级别的访问时,代码判断行和当基于用户名和的访问时,要不相同,应该是:

  IfSession("MM_Username")<>""andSession("MM_UserAuthorization")<>""Then

  over,theend:)

  

相关阅读Readings
留言评论Comment
精彩推荐Recommend
Copyright © 2010-2017 XPlaySoft.com 软件玩家 All Rights Reserved 粤ICP备12021207号