喜悦国际村 » 喜悦原创 » DISCUZ浅析之COOKIE篇

页: [1]
isno2008-3-20 02:47 PM
DISCUZ浅析之COOKIE篇

DISCUZ浅析之COOKIE篇

相信论坛里的朋友很多都在用discuz 并会因为种种的需要结合discuz做各种系统
对此,discuz提供了通行证 可有时候使用通行证不一定适用 就比如说那一段很长很长的url吧 看着就让人心烦
有什么解决方法捏?为了社区朋友们以后方便开发 这几天呕心沥血 肝肠寸断 孜孜不倦 终于让偶给想出了一个比较天才的想法
:hoho 那就是生成一个discuz 验证cookie

废话说完了 开始正题:
开始之前 咱先了解一下discuz的登陆机制

先来一个简单的form
[php]
<form action='i_login.php'>
        user:<input  name='username' type='text'>
        password:<input name='password' type='password'>
        <input type='submit' value='login'>
</form>
[/php]

(上面的代码不用我解释吧 啥 看不懂? 得 我告诉你 这就是HTML 也就我这样 比较资深的专家才能写出来)

OK,一个很实用的登录框已经完成。。。

下面 说下php方面的 我们假设改文件和discuz同一目录里
看代码
i_login.php
[php]
        <?php

        /**
         * 加载discuz的入口文件 当然你也可以不加 不过你得提出几个必要的函数
        */
         require_once './include/comon.inc.php';


         $formUsername = trim($username); // 接受POST传来的$username
         $formPassword = trim($password); // 接受POST传来的$password
       

        /**
         *  说下下面的secques
         *  secques呢 是论坛里的安全回答经过编码后提取的一段字符 虽然我们登陆的时候不会用到它
         *  但是生成COOKIE呢 它还是不可或缺的滴
        */


         $query = $db->query("SELECT uid,password,secques FROM cdb_members WHERE username='$formUsername'");
         $member = $db->fetch_array($query);

         // 验证用户密码是否匹配
         if($member['password'] == md5($formPassword))
         {
                // 已经验证用户密码都是匹配的 下面比较关键的就是生成cookie了 可要仔细看好了


                /*

                 先说下dsetcookie函数  这是一个dz一个设置cookie的函数 可以在include/global.func.php里查看
                 通常只需要三个参数即可 第一个为cookie键 第二个为键值 第三个为cookie有效时间 这里我就随便设置一个

                 再说 authcode 此为加密函数  俺一直用这个函数 很强大 很难破解 有兴趣的朋友也可在include/global.func.php里
               
                        找到改函数 研究一下
                */
                dsetcookie('sid','',-2423234234); // 注销掉sid
                dsetcookie('auth', authcode("$formPassword\t$$member['secques']\t$member['uid']", 'ENCODE'), '1234243');


                // OK 关键步骤 我们都已经完成了 下面就由你写一个header跳转到论坛首页看是否登陆了 我本地测试可以 你由问题的话那可就是
                // RPWT了


                header("location:/index.php");



         }
         else
         {
                // 我们这里返回一个错误信息 告诉那个用户密码错误
         }
       
        ?>
[/php]

好 一个简单的登陆验证就完成了

如果你不想加载common.inc.php文件的话 你需要提取
authcode 和dsetcookie函数 都比较简单哈

OK 我们继续说下discuz验证部分 没兴趣的可以跳过去

验证部分 在common.inc.php 大约119行 开始

[php]

// 拆解COOKIE auth
list($discuz_pw, $discuz_secques, $discuz_uid) = isset($_DCOOKIE['auth']) ? explode("\t", authcode($_DCOOKIE['auth'], 'DECODE')) : array('', '', 0);

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

// 不存在$_DCOOKIE['auth']的话 就直接清楚COOKIE
if(isset($_DCOOKIE['auth']) && !$discuz_uid) {
        clearcookies();
}

$newpm = $newpmexists = $sessionexists = $seccode = $bloguid = 0;
if($sid) {

      //存在$discuz_uid的话 根据uid取出用户信息 否则根据sid
        if($discuz_uid) {
                // 取用户信息
        } else {
                // 用sessions表中取用户信息
        }

        // 下面就是验证了 我不写了 (sid是用户的一个sessionid 用户登陆后会在sessions表内生成一条用户记录 用户推出后该记录删除

[/php]


代码就随手写上来  并没有经过测试 可能有的地方说的也不是很清楚 还请大伙原谅哈
请继续关注偶的第二篇菜文 discuz浅析之模板引擎篇

未完待续.....

关于作者:isno。接近90后人,05年进入php大家庭,现为上海某某公司一无名phper。

网站:[url]www.isno.cn[/url]
MSN:[email]isno@yahoo.cn[/email]
转载请注明作者及出处([url]www.isno.cn)[/url]。

dreamblaze2008-3-21 02:47 AM
其实。。我就是这样做的

qibinghua2008-3-21 08:26 AM
我记得有个人的名字和isno很像,忘记是谁来.

qh6632008-3-28 05:12 PM
90后呀,才十多岁……

darkcc1232008-3-30 02:57 PM
90?才18岁呀?

dreamblaze2008-4-1 08:50 AM
小P孩啊。。。为了MM跑上海去,果然是年轻人!我都不敢为了MM跑沈阳去了,唉,老了,懦弱了

scf22008-4-8 02:32 PM
DZ这个思路很不错的

mdy_jun2008-4-16 03:02 AM
解释的很清楚.学习了.改天看看 authcode这个加密函数

gouki2008-4-21 04:00 PM
有必要搞得这么复杂吗?
不过……DZ还是把反斜框注释掉了。详细可以看他的解析cookie那段,明明是explode("\t"),结果……就成了t了

剑枫2008-5-5 06:09 AM
参见UC......

henanren2008-5-7 08:51 AM
很好,谢谢你


查看完整版本: DISCUZ浅析之COOKIE篇


Powered by Discuz! Archiver 6.1.0  © 2001-2006 Comsenz Inc.
Processed in 3.851842 second(s), 2 queries