always there for you

善于生活,善于学习,这是我和你的目标.

« 理解VMware的3种网络模型Microsoft IE 7弹出窗口地址栏URI欺骗漏洞 »

防止用户重复登陆-asp

   前言:

   在网页开发中,做登陆逻辑处理时,很多新人(包括我,呵呵)都没有对一个用户重复登陆来编写代码进行处理!.

   试想一个用户登陆后,其他人还可以用这个用户名登陆,那么注册新的用户就没什么必要了,而且也不利于管理员管理!.

   以下是我以前做的两个代码,关于重复登陆的,希望大家能够一起思考和指出我的思维遗漏!.

   思路:

    要想阻止用户重复登陆,必须要保证连接到服务器上的这个用户始终只有一个,所以当用户进行合法登陆后,服务器需始终确认只有这个用户在线!我们可以在第一个用户登陆后,给他赋个代表他什么时候登陆的值,这个值可以存在数据库,xml(不安全),和application对象中,因为这个值提供的信息是要给所有用户一个指示,"这个用户什么时候登陆了,在这段期间你不能再以这个用户身份登陆",所以不能存在session对象里,然后我们要确保存在这个application对象的值的所有者是谁,就是是谁什么时候登陆了,所以我们要以用户名来作标识.所以确定的是登陆信息以application(userName)的形式来存取!.

    --- 即登陆成功后!一般都是查询用户名和密码是否与数据库中的匹配

    1.提示已登陆式

    if Application(session("UserName"))="" then            '-当这个值为空,证明用户没有登陆

        Session("UserName")=UserName                        
       Application(session("UserName"))=now()              '-存取这个用户的登陆时间
       Session("Time")=now()                                               '-存取这个用户最后一次操作的时间
       Response.Redirect("index.asp")                               '-在他登陆后要操作的每个页面都更新它的最后一次操作时间Session("Time")和这个用
                                                                                                 '-- 户还在登陆的时间,Application(session("UserName"))

  else                                                                                      '-说明这个用户已经登陆过了

       if DateDiff("n",Application(session("UserName")),now())>=5 then      '-当他5分钟以上没有任何操作,则让另外一个以这个用户身份的人登陆

                       Session("UserName")=UserName                         
                       Application(session("UserName"))=now()              '-存取这个用户的登陆时间
                       Session("Time")=now()                                               '-存取这个用户最后一次操作的时间
                       Response.Redirect("index.asp")  

        else                                                                                                                    '-当这个用户离上次操作时间还在5分钟之类,认为他是在线状态,报错

                        response.Write "<script LANGUAGE='javascript'>alert('该用户已经存在,请稍后再登陆!');parent.location='index.asp';</script>"
                        response.End()

        end if

   end if

        这只是登陆时要处理的代码,关键是在所有页面都要更新Application(session("UserName"))Session("Time")
       
缺点:当一个用户登陆后,不做任何操作或立即退出,其他用户将在5分内不能再以这个用户身份登陆!

    2.挤人式

      大家都知道当你的QQ号码被别人在另外的地点登陆后,你就会被迫下线,这种就是我所说的挤人式,后登陆的挤掉前面登陆的,真是"长江后浪推前浪,前浪死在沙滩上".

       '-当用户填写的用户名和密码匹配数据库中,给他加上登陆标识

           Session("UserName")=UserName
           Application(session("UserName"))=now()
           Session("Time")=now()
           Response.Redirect("index.asp")
     
         '-这种方法的关键是在所有页面加上检测代码:
              if session("UserName")="" then
                   call CusRes("服务器超时,请重新登陆!","parent.location.href='login.asp';")
             end if
             if Application(session("UserName"))<>session("Time") then
                     Call CusRes("您的帐号已经被迫在另外一处登陆,请立即找回您的密码!","parent.location.href='login.asp';")     
             end if

    大家如果还有什么其他的方法,或发现以上代码有哪些漏洞,可以直接留言给我!.转载请注明出处:always there' Blog.

  • quote 2.初学
  • if Application(session("UserName"))="" then '-当这个值为空,证明用户没有登陆

    Session("UserName")=UserName

    对Application(session("UserName"))进行判断有意义吗???
    貌似是在检查所有的Session的username是否为空
    alwaysthere 于 2008-5-23 11:57:06 回复
    Application(session("UserName"))这存入的是session("UserName")这个人的上次操作时间!.
    不存入上次操作时间怎么比较!.而且必须存入session("UserName"),因为application是公共的,只有通过application(session("UserName"))才知道是比较哪个用户的上次操作时间!..
  • 2008-5-23 11:37:21 回复该留言
  • quote 1.webdebug
  • 对于第一种方法还是有可能导致同时登录的。当一个用户登录后,等5分钟再在另一个地方登录同一个用户。但是此时第一个用户还是可以操作的。这样就延伸出多个用户同时登录。
    alwaysthere 于 2008-4-24 9:14:51 回复
    应该是不行的!.
    当第二个人在5分钟或5分钟以上在另外一个地方登陆,则application(session("UserName"))已经改变,第一个用户的session("Time")还是以前那个,所以第一个用户则操作不了!.会被报错!.
  • 2008-4-23 22:47:02 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Copyright www.alwaysthere.com.cn . Some Rights Reserved.

              

Powered By Z-Blog 1.8 Devo Build 80201