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); } … … }