查看: 4163|回复: 6

实现不可同时同ID登陆的方法原理(仅供参考)

[复制链接]
发表于 2008-3-2 14:28:48 | 显示全部楼层 |阅读模式
PHPCMS实现不可同时同ID登陆的方法原理(同QQT掉已登陆的人)

原理:
member表中建立checkcode字段,登陆时用用cookie写成MD5加入字段中,当其他人再登陆,后重新写checkcode MD5,程序验证checkcode MD5时候相同,如果不同,就T

方法:
MEMBER表中建立checkcode字段类型是:varchar 长度20允许null~
字符集gbk,整理gbk_chinese_ci

打开/include/common.inc.php
找到142行,替换掉if($phpcms_auth)


  1. if($phpcms_auth)
  2. {
  3.        $phpcms_auth_key = md5($PHPCMS['authkey'].$_SERVER['HTTP_USER_AGENT']);
  4.        list($_userid, $_password, $_answer) = $phpcms_auth ? explode("\t", phpcms_auth($phpcms_auth, 'DECODE')) : array(0, '', '');
  5.        $_userid = intval($_userid);
  6.        if($_userid < 0) $_userid = 0;
  7.        if($_userid)
  8.        {
  9.               $memberinfo = $db->get_one("SELECT username,password,groupid,arrgroupid,email,chargetype,begindate, enddate,money,point,credit,newmessages,checkcode FROM ".TABLE_MEMBER." WHERE userid=$_userid LIMIT 0,1");
  10.               
  11.               //check code
  12.               if($checkcode!=$memberinfo['checkcode']){
  13.                      mkcookie('auth', '');
  14.                      mkcookie('checkcode', '');
  15.                      showmessage('您的用户已经在其他地方登录,请重新登录');
  16.               }
  17.               
  18.               if($memberinfo && $memberinfo['password'] == $_password)
  19.               {
  20.                      if($memberinfo['groupid'] == 2)
  21.                      {
  22.                 mkcookie('auth', '');
  23.                             showmessage($LANG['userid_banned_by_administrator']);
  24.                      }
  25.                      @extract($memberinfo, EXTR_PREFIX_ALL, '');
  26.                      unset($memberinfo, $_password, $_answer);
  27.                      $_arrgroupid = $_arrgroupid ? array_filter(explode(',', $_arrgroupid)) : array();
  28.               }
  29.               else
  30.               {
  31.                      mkcookie('auth', '');
  32.               }
  33.        }
  34. }
复制代码
打开/member/include/member.class.php替换function login
53
  1. function login($login_password, $login_cookietime = 0, $forward = '')
  2.        {
  3.               global $PHPCMS,$PHP_TIME,$PHP_IP,$LANG;
  4. <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
  5.               $info = $this->get_info();
  6.               if(!$info)
  7.               {
  8.                      $this->errormsg = 'user_not_exists';
  9.                      return FALSE;
  10.               }

  11.               @extract($info);

  12.               $login_password = md5($login_password);
  13.               if($password != $login_password && $password != substr($login_password, 8, 16))
  14.               {
  15.                      $this->errormsg = 'password_is_wrong';
  16.                      return FALSE;
  17.               }

  18.               if($groupid == 2)
  19.               {
  20.                      $this->errormsg = 'user_is_locked';
  21.                      return FALSE;
  22.               }
  23.               elseif($groupid == 4)
  24.               {
  25.                      $this->errormsg = 'user_is_verify';
  26.                      return FALSE;
  27.               }
  28.               elseif($groupid == 5)
  29.               {
  30.                      $this->errormsg = 'user_is_checking';
  31.                      return FALSE;
  32.               }

  33.               $_cookietime = $login_cookietime ? intval($login_cookietime) : (getcookie('cookietime') ? getcookie('cookietime') : 0);
  34.               $cookietime = $_cookietime ? $PHP_TIME + $_cookietime : 0;
  35.               $phpcms_auth_key = md5($PHPCMS['authkey'].$_SERVER['HTTP_USER_AGENT']);
  36.               $phpcms_auth = phpcms_auth($userid."\t".$password."\t".$answer, 'ENCODE', $phpcms_auth_key);
  37.               mkcookie('auth', $phpcms_auth, $cookietime);
  38.               mkcookie('cookietime', $_cookietime, $cookietime);
  39.               
  40.               //insert checkcode
  41.               $checkcode = substr(md5('xiashiyu'.rand(0,(double)microtime() * 1000000)),0,20);
  42.               mkcookie('checkcode', $checkcode, $cookietime);
  43.               
  44.               $this->db->query("UPDATE ".TABLE_MEMBER." SET lastloginip='$PHP_IP',lastlogintime=$PHP_TIME,logintimes=logintimes+1,checkcode='$checkcode' WHERE username='$this->username'");
  45.               
  46.               if($forward) showmessage($LANG['login_success'], $forward);
  47.               return $info;
  48.        }
复制代码


..




[ 本帖最后由 aiens 于 2008-10-16 08:50 PM 编辑 ]
发表于 2008-4-27 15:08:07 | 显示全部楼层

如何实现某些指定的用户绑定IP

如何实现某些指定的用户绑定IP?以防止其他人盗用别人的用户名密码在其它IP上登陆?望不吝赐教
发表于 2008-12-4 12:48:38 | 显示全部楼层
:handshake 顶下
发表于 2009-4-3 00:01:01 | 显示全部楼层
收藏了!你总是给些好想法o(∩_∩)o...哈哈
发表于 2009-4-3 11:14:23 | 显示全部楼层
感谢分享-
发表于 2009-4-3 22:46:18 | 显示全部楼层
感谢分享
发表于 2009-4-4 19:58:53 | 显示全部楼层
:handshake :handshake
您需要登录后才可以回帖 登录 | 点击这里注册

本版积分规则

小黑屋|Archiver|phpcms网站管理系统 ( 京ICP备14011169 )

GMT+8, 2019-12-8 10:15 , Processed in 0.238084 second(s), 9 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表