当前位置: 首页 > 图文教程 > 网络编程 > PHP > 关于DISCUZ不用通行证登陆得内容介绍

PHP
让我们来编写一些PHP实用的脚本
七种缓存使用武器 为网站应用和访问加速
动态网页PHP中引用&的使用注意事项
在PHP中全面阻止SQL注入式攻击
PHP自带可以代替echo调试的unit函数
小结:PHP动态网页程序优化及高效提速问题
php对特殊语句查询结果进行数组排序
实例:用PHP技术解决网站URL格式过长的问题
小结:PHP动态网页程序两个有用的小技巧
动态网页中直接不让访问PHP程序文件
网页实例:详细介绍用PHP来编写网页记数器
菜鸟学习:动态网页PHP基础学习笔记
利用Apache实现禁止图片盗链
PHP编程中常用的三则技巧
PHP制作的网站意见在线反馈表
大型Web需求解决方案 PHP定位突出
PHP实例:精确到每一秒钟的在线人数显示代码
实用:动态网页制作技术PHP的十个应用技巧
常见php页面漏洞分析及相关问题解决
PHP和MYSQL制作动态网站开发经验之谈

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 91 ::
收藏到网摘: n/a

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的时候。这时候论坛应该可以登陆了,如果不能登陆,请看下面
DISCUZ是中国最常用的论坛,虽然他本身有通行证给大家连接,但实际上用户的统一还是很不好,经常要建立两个用户表,第一不利于注册和管理,第二浪费数据库。
我们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的信息了。