关于DISCUZ不用通行证登陆得内容介绍

关于DISCUZ不用通行证登陆得内容介绍
DISCUZ是中国最常用的论坛,虽然他本身有通行证给大家连接,但实际上用户的统一还是很不好,经常要建立两个用户表,第一不利于注册和管理,第二浪费数据库。
最近做一个项目也是使用的DISCUZ,所以研究了一下DISCUZ的登陆,基本完成了同步登陆。大家如果有兴趣可以研究一下。
别的不废话了,如果你自己写的系统,可以直接用DISCUZ的公用文件,直接引用include/common.inc.php就好了,这样最简单了,只要引用这个文件,$discuz_uid就是你的用户ID了,$discuz_user就是你的用户名,
如果你用的自己的公用文件,就要提取两个函数,在global.func.php中,有两个函数
Dsetcookie,和authcode,如果你不懒的话在复制一个函数clearcookies,第一个就是DISCUZ自己的建造COOKIE的函数,第二个是DISCUZ的可逆加密函数,第三个是清除COOKIE函数,我是放到我自己的FUNC.PHP文件中了
好了,咱们开始写建立和识别COOKIE的方法了
function lgoin($array)
{
$username = $array[‘username’];
$password = $array[‘password’];
$sql = “SELECT `uid`,`password`,`secques` FROM `cdb_members` WHERE
`username`=’$username’ and `password`=md5(‘$password’)”;
try {
$rs = $this -> _db -> query($sql);
}catch (Exception $e){
exit(“查询出错,出错信息:”.$e->getMessage());
return 0;
}
$row = $this -> _db -> fetch($rs); //查询登陆的用户名和密码是否正确
if($row){
dsetcookie(‘sid’,”,-2423234234); // 注销掉sid
$secques = $row[‘secques’];
$uid = $row[‘uid’];
$formPassword = $row[‘password’];
dsetcookie(‘auth’, authcode(“$formPassword\t$secques\t$uid”, ‘ENCODE’,’123′), ‘0’);
return 1;
}else{
return 2;
}
}

这是一个登陆函数,废话不说了,直接说关键部分吧,在查询之后,当获得到信息后,(用户名和密码正确的话)我们获得3个信息,UID,PASSWORD,和SECQUES,这三个是DISCUZ建立COOKIE需要用的,第一个是用户ID,第二个是加密后的密码,第三个是加密后的回答问题答案(即使没有设置也要用),DISCUZ是需要提示问题和答案的,而我们登陆就不需要了,所以我这里直接把他查出来了。dsetcookie(‘auth’, authcode(“$formPassword\t$secques\t$uid”, ‘ENCODE’,’123′), ‘0’);
这句就是建立用户的COOKIE,别的不用说了,请注意这句’123’,这个地方一定要注意,这个是加密时设置的KEY,就是你这里需要和你DISCUZ的一样,所以有三个地方一定要统一,一个是global.func.php,一个是你自己复制出来的那个authcode函数,还有就是你在使用authcode的时候。这时候论坛应该可以登陆了,如果不能登陆,请看下面
我们var_dump($_COOKIE)一下,发现显示的是:array(5) { [“eVb_cookietime”]=> string(7) “2592000” [“eVb_oldtopics”]=> string(3) “D1D” [“eVb_sid”]=> string(6) “HfxRDJ” [“eVb_auth”]=> string(68) “LSwuxyf7QECdnc+9AxgOihQvc1ScFQQsUvgnafBVrFmuHq8DlIvj57rq1PVRlJ05g1Kb” [“eVb_visitedfid”]=> string(1) “2” }(可能有不一样的地方,不用着急)
我们这里注意一下eVb_auth,其实我们的加密信息被存储到这个COOKIE里了,这里的EVB是DISCUZ默认的COOKIE前缀,如果你更改了COOIKE的话这个也会变化。
所以我们就要处理这个eVb_auth;
function is_login()
{
if(isset($_COOKIE[‘eVb_auth’])){
list($discuz_pw, $discuz_secques, $discuz_uid) = isset($_COOKIE[‘eVb_auth’]) ? explode(“\t”, authcode($_COOKIE[‘eVb_auth’], ‘DECODE’,’123′)) : array(”, ”, 0);

$discuz_pw = addslashes($discuz_pw);
$discuz_secques = addslashes($discuz_secques);
$discuz_uid = intval($discuz_uid);

// 不存在$_DCOOKIE[‘auth’]的话 就直接清楚COOKIE
if(isset($_COOKIE[‘eVb_auth’]) && !$discuz_uid) {
clearcookies();
}
if($discuz_uid){
$sql = “SELECT `username`,`groupid` FROM `cdb_members` WHERE `uid`=’$discuz_uid'”;
$rs = $this -> _db -> query($sql);
$row = $this -> _db -> fetch($rs);
$discuz_groupid = $row[‘groupid’];
$discuz_username = $row[‘username’];
return $array = array(“discuz_uid”=>$discuz_uid,”discuz_groupid” => $discuz_groupid,
“discuz_username” => $discuz_username);
}
}else{
if(isset($_COOKIE[‘eVb_sid’])){
$sid = $_COOKIE[‘eVb_sid’];
$sql = “SELECT `uid`,`username`,`groupid` FROM `cdb_sessions` WHERE sid =’$sid'”;
$rs = $this -> _db -> query($sql);
$row = $this -> _db -> fetch($rs);
if($row){
$discuz_groupid = $row[‘groupid’];
$discuz_username = $row[‘username’];
$discuz_uid = $row[‘uid’];
return $array = array(“discuz_uid”=>$discuz_uid,”discuz_groupid” => $discuz_groupid,
“discuz_username” => $discuz_username);
}else{
return 0;
}

}else{
return 0;
}
}
}

我们先看if(isset($_COOKIE[‘eVb_sid’])){前的这部分
个人感觉唯一要解释一下的就是这句:list($discuz_pw, $discuz_secques, $discuz_uid) = isset($_COOKIE[‘eVb_auth’]) ? explode(“\t”, authcode($_COOKIE[‘eVb_auth’], ‘DECODE’,’123′)) : array(”, ”, 0);

这是将EVB_AUTH解密的过程,这里用DECODE来解密,记得后面的123是你的KEY,要保持一直,不然解密不会成功的。
然后在看下半部分:
DISCUZ是通过SESSION和COOKIE两种方式加密的,而他的SESSION保存在数据库中,我们下边这部分就是利用当没有$_COOKIE[‘eVb_auth’]时,用$_COOKIE[‘eVb_sid’]来取出信息;这不过是个数据库操作,没啥好将的,这样,通过建立和读取我们就可以取出DISCUZ的信息了。

]]>

原创文章,作者:键盘游走者,如若转载,请注明出处:http://www.708034.com/2008/05/%e5%85%b3%e4%ba%8ediscuz%e4%b8%8d%e7%94%a8%e9%80%9a%e8%a1%8c%e8%af%81%e7%99%bb%e9%99%86%e5%be%97%e5%86%85%e5%ae%b9%e4%bb%8b%e7%bb%8d/

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注