discuz代码分析(logging.php)

作者:不要清闲   2008-02-29 16:37:04   点击:254   评论:0
  1. <?php   
  2. //定义操作页面   
  3. define('CURscrīpt''logging');   
  4.   
  5. //包含公共文件   
  6. require_once './include/common.inc.php';   
  7. //包含misc函数文件   
  8. require_once DISCUZ_ROOT.'./include/misc.func.php';   
  9. //判断动作   
  10. //注销   
  11. if($action == 'logout' && !emptyempty($formhash) && $formhash == FORMHASH) {   
  12.     //清除cookies   
  13.  clearcookies();   
  14.  //重置用户状态为游客   
  15.  $groupid = 7;   
  16.  $discuz_uid = 0;   
  17.  //清除用户名密码   
  18.  $discuz_user = $discuz_pw = '';   
  19.  //重置页面样式   
  20.  $styleid = $_DCACHE['settings']['styleid'];   
  21.     //显示注销成功页面   
  22.  showmessage('logout_succeed', dreferer());   
  23.   
  24. }   
  25. //登陆   
  26. elseif($action == 'login') {   
  27.     //判断用户是否为游客   
  28.  if($discuz_uid) {   
  29.   //显示登陆成功页面   
  30.   showmessage('login_succeed'$indexname);   
  31.  }   
  32.  //登陆用户名的字段名   
  33.  $field = isset($loginfield) && $loginfield == 'uid' ? 'uid' : 'username';   
  34.     //验证码检查   
  35.  //get secure code checking status (pos. -2)   
  36.  $seccodecheck = substr(sprintf('%05b'$seccodestatus), -2, 1);   
  37.     //判断是否为提交登陆        
  38.  if(!submitcheck('loginsubmit', 1, $seccodecheck)) {   
  39.         //显示登陆页面   
  40.   $discuz_action = 6;   
  41.   
  42.   $referer = dreferer();   
  43.   
  44.   $thetimenow = '(GMT '.($timeoffset > 0 ? '+' : '').$timeoffset.') '.   
  45.    gmdate("$dateformat $timeformat"$timestamp + $timeoffset * 3600).   
  46.   
  47.   $styleselect = '';   
  48.   $query = $db->query("SELECT styleid, name FROM {$tablepre}styles WHERE available='1'");   
  49.   while($styleinfo = $db->fetch_array($query)) {   
  50.    $styleselect .= "<option value=\"$styleinfo[styleid]\">$styleinfo[name]</option>\n";   
  51.   }   
  52.   
  53.   $_DCOOKIE['cookietime'] = isset($_DCOOKIE['cookietime']) ? $_DCOOKIE['cookietime'] : 2592000;   
  54.   $cookietimecheck = array((isset($_DCOOKIE['cookietime']) ? intval($_DCOOKIE['cookietime']) : 2592000) => 'checked');   
  55.   
  56.   if($seccodecheck) {   
  57.    $seccode = random(4, 1);   
  58.   }   
  59.   
  60.   include template('login');   
  61.   
  62.  } else {   
  63.         //处理登陆   
  64.         //用户信息置空   
  65.   $discuz_uid = 0;   
  66.   $discuz_user = $discuz_pw = $discuz_secques = $md5_password = '';   
  67.   $member = array();   
  68.         //判断是否被限制登陆,返回0,1,2,3。声明在misc.func.php   
  69.   $loginperm = logincheck();   
  70.   if(!$loginperm) {   
  71.    //显示限制登陆   
  72.    showmessage('login_strike');   
  73.   }   
  74.         //安全提问处理,返回一串字符或空。声明在global.func.php   
  75.   $secques = quescrypt($questionid$answer);   
  76.   //判断是否安全提问页面登陆   
  77.   if(isset($loginauth)) {   
  78.    $field = 'username';   
  79.    $password = 'VERIFIED';   
  80.    list($username$md5_password) = explode("\t", authcode($loginauth'DECODE'));   
  81.   } else {   
  82.    $md5_password = md5($password);   
  83.    $password = preg_replace("/^(.{".round(strlen($password) / 4)."})(.+?)(.{".round(strlen($password) / 6)."})$/s""\\1***\\3"$password);   
  84.   }   
  85.         //查询数据表members,usergroups   
  86.   $query = $db->query("SELECT m.uid AS discuz_uid, m.username AS discuz_user, m.password AS discuz_pw, m.secques AS discuz_secques,   
  87.      m.adminid, m.groupid, m.styleid AS styleidmem, m.lastvisit, m.lastpost, u.allowinvisible   
  88.      FROM {$tablepre}members m LEFT JOIN {$tablepre}usergroups u USING (groupid)   
  89.      WHERE m.$field='$username'");   
  90.         //取出用户认证信息包括UID,用户名,密码,安全提问,管理权限,用户组ID,页面风格,上次访问,最后发帖,是否允许隐身   
  91.   $member = $db->fetch_array($query);   
  92.         //验证登陆   
  93.   if($member['discuz_uid'] && $member['discuz_pw'] == $md5_password) {   
  94.             //验证安全提问   
  95.             if($member['discuz_secques'] == $secques) {   
  96.     //安全提问匹配   
  97.     //从数组中将变量导入到当前的符号表    
  98.     extract($member);   
  99.                 //处理用户名   
  100.     $discuz_userss = $discuz_user;   
  101.     $discuz_user = addslashes($discuz_user);   
  102.                 //判断隐身模式   
  103.     if(($allowinvisible && $loginmode == 'invisible') || $loginmode == 'normal') {   
  104.      //更新members表用户现在的模式:隐身或普通   
  105.      $db->query("UPDATE {$tablepre}members SET invisible='".($loginmode == 'invisible' ? 1 : 0)."' WHERE uid='$member[discuz_uid]'", 'UNBUFFERED');   
  106.     }   
  107.   
  108.     $styleid = intval(emptyempty($_POST['styleid']) ? ($styleidmem ? $styleidmem :   
  109.       $_DCACHE['settings']['styleid']) : $_POST['styleid']);   
  110.   
  111.     $cookietime = intval(isset($_POST['cookietime']) ? $_POST['cookietime'] :   
  112.       ($_DCOOKIE['cookietime'] ? $_DCOOKIE['cookietime'] : 0));   
  113.     //写cookie   
  114.     dsetcookie('cookietime'$cookietime, 31536000);   
  115.     dsetcookie('auth', authcode("$discuz_pw\t$discuz_secques\t$discuz_uid"'ENCODE'), $cookietime);   
  116.   
  117.     $sessionexists = 0;   
  118.     //判断是否为等待验证会员   
  119.     if($groupid == 8) {   
  120.      showmessage('login_succeed_inactive_member''memcp.php');   
  121.     } else {   
  122.      showmessage('login_succeed', dreferer());   
  123.     }   
  124.    } elseif(emptyempty($secques)) {   
  125.     //安全提问不匹配且安全提问不为空   
  126.     $username = dhtmlspecialchars($member['discuz_user']);   
  127.     $loginmode = dhtmlspecialchars($loginmode);   
  128.     $styleid = intval($styleid);   
  129.     $cookietime = intval($cookietime);   
  130.     //加密已接受的用户名和密码   
  131.     $loginauth = authcode(addslashes($member['discuz_user'])."\t".addslashes($member['discuz_pw']), 'ENCODE');   
  132.     //显示回答安全提问   
  133.     include template('login_secques');   
  134.     dexit();   
  135.   
  136.    }   
  137.   
  138.   }   
  139.         //生成密码错误日志记录   
  140.   $errorlog = "<?PHP exit('Access Denied'); ?>\t".$timestamp."\t".   
  141.    dhtmlspecialchars($member['discuz_user'] ? $member['discuz_user'] : stripslashes($username))."\t".   
  142.    $password."\t".   
  143.    ($secques ? "Ques #".dhtmlspecialchars($questionid) : '')."\t".   
  144.    $onlineip."\n";   
  145.   
  146.   loginfailed($loginperm);   
  147.         //日志记录加入日志文件   
  148.   @$fp = fopen(DISCUZ_ROOT.'./forumdata/illegallog.php''a');   
  149.   @flock($fp, 2);   
  150.   @fwrite($fp$errorlog);   
  151.   @fclose($fp);   
  152.         //显示登陆出错页面   
  153.   showmessage('login_invalid', NULL, 'HALTED');   
  154.   
  155.  }   
  156.   
  157. }   
  158. else {   
  159.  showmessage('undefined_action');   
  160. }   
  161. ?>  
关于我们 | 代理合作 | 解决方案 | 常见问题 | 新闻资讯 | SEO博客
西安鸿亿网络科技有限公司
2007-2008 Inc.西安鸿亿网络科技有限公司.版权所有 陕ICP备07011159号
联系电话: 029-88726470   传真: 029-88726470   地址: 西安市高新区电子二路36号14F-1