ucenter 

  

用户相关表  

uc_members  

uc_memberfields  

   

bbs用户相关表  

cdb_members  

cdb_memberfields  

   

在ucenter里新建的一个用户ucuser1会在uc_members 里显示,但bbs里却没有这个用户,也就说cdb_members里没有ucuser1这个用户。必须在论坛里点登录,然后输入ucuser1的密码,这时会提示“您的帐号需要激活”。激活之后,在cdb_members就会有ucuser1这个用户了。  

当在论坛里注册用户名这bbsuser1后,会在cdb_members ,uc_members 各加入bbsuser1,但是在数据库里这两个表的password字段的值却不一样,大概加密方式不同。但是它们的原密码是一样的。  

   

cdb_memberfields表里放的是用户的资料信息。  

 

找一下bbs加密方式 

在members.inc.php的1118行左右, 

elseif($operation == ‘edit’) 操作是编辑 

1142行 

if(!submitcheck(‘editsubmit’)) { //这里显示出编辑的表单} 

else{ 

    require_once DISCUZ_ROOT.’./uc_client/client.php’; //将ucenter的客户端程序文件包含进来 

  

    $ucresult = uc_user_edit($member['username'], $passwordnew, $passwordnew, $emailnew, 1, $questionid); //调用ucenter API的函数。 



打开discuz论坛,根目录下的uc_client/client.php 

define(‘UC_API_FUNC’, UC_CONNECT == ‘mysql’ ? ‘uc_api_mysql’ : ‘uc_api_post’); 这里比较关键。连接 UCenter 的方式,这里是定义是否用数据库,一般都是用数据库操作用户信息的。 

具体的ucenter接口开发,discuz官方有相应的手册。对于这个常量,手册里是这么说的

UC_CONNECT 
 连接 UCenter 的方式
mysql:MySQL 方式
空:远程方式 
 

这个UC_CONNECT 定义是bbs/config.inc.php 里, 

 

  

上面调用了 

function uc_user_edit($username, $oldpw, $newpw, $email, $ignoreoldpw = 0, $questionid = ”, $answer = ”) { 

    return call_user_func(UC_API_FUNC, ‘user’, ‘edit’, array(‘username’=>$username, ‘oldpw’=>$oldpw, ‘newpw’=>$newpw, ‘email’=>$email, ‘ignoreoldpw’=>$ignoreoldpw, ‘questionid’=>$questionid, ‘answer’=>$answer)); 

} 

这个函数好像没有什么操作,其实它调用者了 UC_API_FUNC()这个函数,但是在页面上找不到这个函数定义,其实看一下上面那个define(‘UC_API_FUNC’, UC_CONNECT == ‘mysql’ ? ‘uc_api_mysql’ : ‘uc_api_post’); 

这里是把UC_API_FUNC定义成uc_api_mysql() 

代入参数看看,uc_api_mysql()是怎么执行的, $model=’user’,$action=’edit’,$args的值是一个数组,里面是用户的一些基本信息,如;username,oldpw,newpw,email等。 

  

function uc_api_mysql($model, $action, $args=array()) { 

    global $uc_controls; 

    if(empty($uc_controls[$model])) { 

        include_once UC_ROOT.’./lib/db.class.php’; 

        include_once UC_ROOT.’./model/base.php’; 

        include_once UC_ROOT.”./control/$model.php”; //将user.php包含进来 

        eval(“$uc_controls['$model'] = new {$model}control();”); //实例化一个usercontrol() 

    } 

    if($action{0} != ‘_’) { 

        $args = uc_addslashes($args, 1, TRUE); 

        $action = ‘on’.$action; //将方法名变成onedit() 

        $uc_controls[$model]->input = $args; 

        return $uc_controls[$model]->$action($args); 

    } else { 

        return ”; 

    } 

} 

最后会调用 

function onedit() { 

        $this->init_input(); 

        $username = $this->input(‘username’); 

        $oldpw = $this->input(‘oldpw’); 

        $newpw = $this->input(‘newpw’); 

        $email = $this->input(‘email’); 

        $ignoreoldpw = $this->input(‘ignoreoldpw’); 

        $questionid = $this->input(‘questionid’); 

        $answer = $this->input(‘answer’); 

  

        if(!$ignoreoldpw && $email && ($status = $this->_check_email($email, $username)) < 0) { 

            return $status; 

        } 

        $status = $_ENV['user']->edit_user($username, $oldpw, $newpw, $email, $ignoreoldpw, $questionid, $answer); 

  

        if($newpw && $status > 0) { 

            $this->load(‘note’); 

            $_ENV['note']->add(‘updatepw’, ‘username=’.urlencode($username).’&password=’); 

            $_ENV['note']->send(); 

        } 

        return $status; 

    } 

//这里有个$_ENV 这个是个环境变量,里面放的是系统信息,用var_dump()输出一下就知道了。 

不过现在这里还包含了一些自己定义的内容,下面是$_ENV['user']这个元素里的值: 

["user"]=> 

  object(usermodel)#5 (2) { 

    ["db"]=> 

    object(db)#4 (12) { 

      ["querynum"]=> 

      int(5) 

      ["link"]=> 

      resource(7) of type (mysql link) 

      ["histories"]=> 

      array(5) { 

        [0]=> 

        string(59) “SELECT value FROM `myblog`.uc_vars WHERE name=’noteexists1′” 

        [1]=> 

        string(58) “SELECT value FROM `myblog`.uc_vars WHERE name=’mailexists’” 

        [2]=> 

        string(86) “SELECT username, uid, password, salt FROM `myblog`.uc_members WHERE username=’bbstest’” 

        [3]=> 

        string(65) “SELECT COUNT(*) FROM `myblog`.uc_protectedmembers WHERE uid = ’4′” 

        [4]=> 

        string(134) “UPDATE `myblog`.uc_members SET password=’3d033dd527ee8b134403cd30df8c224f’, email=’qihjn@163.com’, secques=” WHERE username=’bbstest’” 

      } 

      ["dbhost"]=> 

      string(9) “localhost” 

      ["dbuser"]=> 

      string(4) “root” 

      ["dbpw"]=> 

      string(0) “” 

      ["dbcharset"]=> 

      string(3) “gbk” 

      ["pconnect"]=> 

      string(1) “0″ 

      ["tablepre"]=> 

      string(12) “`myblog`.uc_” 

      ["time"]=> 

      int(0) 

      ["goneaway"]=> 

      int(5) 

      ["dbname"]=> 

      string(0) “” 

    } 

object(usermodel)#5 (2) 这是它的类型,是usermodel类的实例。 usermodel是在bbs/uc_client/model/user.php里定义的。不过$_ENV['user']这个变量在哪里赋的值我没找到,知道人的告诉我一下。^_^ 

  

$_ENV['user']->edit_user(),在bbs/uc_client/model/user.php 里可以找到这个函数的定义,可看到这样的语句: 

 

这就是在论坛后台修改用户密码的加密方式:md5(md5($oldpw).$data['salt']) 

  

$this->db->query(“UPDATE “.UC_DBTABLEPRE.”members SET $sqladd WHERE username=’$username’”); 

//注意,这里是更新到ucenter的用户表uc_members里。 

  

接下来是更新论坛表cdb_members里的相关信息,当然也包括更新密码。       

$emailadd = $ucresult < 0 ? ” : “email=’$emailnew’, “; 

$passwordadd = $ucresult < 0 ? ” : “, password=’”.md5(random(10)).”‘”; 

密码更新语句,这里是先查看$ucresul= uc_user_edit(…)返回值,如果uc_user_edit没有更新uc_members的密码,那就拉倒。如果更新了,则也更新论坛用户表 cdb_members 里的密码,它的加密方式是 md5(random(10)),结果发现,它随便弄了个随机数md5一下就放到数据库里了,可见这密码应该是没用的。 

  

$db->query(“UPDATE {$tablepre}members SET gender=’$gendernew’, $emailadd posts=’$postsnew’, digestposts=’$digestpostsnew’, 

            pageviews=’$pageviewsnew’, regip=’$regipnew’, regdate=’$regdatenew’, lastvisit=’$lastvisitnew’, lastip=’$lastipnew’, bday=’$bdaynew’, 

            styleid=’$styleidnew’, tpp=’$tppnew’, ppp=’$pppnew’, timeformat=’$timeformatnew’, oltime=’$oltimenew’, 

            showemail=’$showemailnew’, newsletter=’$newsletternew’, invisible=’$invisiblenew’, timeoffset=’$timeoffsetnew’, 

            pmsound=’$pmsoundnew’, sigstatus=’$sigstatusnew’ $passwordadd $secquesadd WHERE uid=’$uid’”); 

} 

  

  

找一下登录流程 

老方法,找到logging.php 

87行 

$ucresult = uc_user_login($username, $password, $loginfield == ‘uid’, 1, $questionid, $answer); //和修改信息一个道理,参看①处 

  

if($ucresult['uid'] > 0) { 

    //登录成功的操作 

} 

  

  

  

①调用了bbs/uc_client/comtrol/user.php里的 

function onlogin() { 

        $this->init_input(); 

        … … 

        if($isuid) { 

            $user = $_ENV['user']->get_user_by_uid($username); 

/*到bbs/uc_client/model/user.php里找到 

get_user_by_uid($uid),可以看到”SELECT * FROM “.UC_DBTABLEPRE.”members WHERE uid=’$uid’” 它是查看uc_members这个表。可是bbs里的cdb_members表里的password并没有起作用。 

*/ 

        return $arr; 

        } else { 

            $user = $_ENV['user']->get_user_by_username($username); 

        } 

        … … 

} 


Comments are closed.

Post Navigation