DISCUZ浅析之COOKIE篇

DISCUZ浅析之COOKIE篇
2008-03-20 11:05 P.M.
相信论坛里的朋友很多都在用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>
?>
(上面的代码不用我解释吧 啥 看不懂? 得 我告诉你 这就是HTML 也就我这样 比较资深的专家才能写出来)

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

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

<?php     $formUsername = trim($username); // 接受POST传来的$username
     
$formPassword = trim($password);
     $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("$formPasswordt$$member['secques']t$member['uid']", 'ENCODE'), '1234243'

);
        

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

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

 

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

如果你不想加载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);// 不存在$_DCOOKIE['auth']的话 就直接清楚COOKIE
if(isset($_DCOOKIE['auth']) && !$discuz_uid) {
    
clearcookies

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

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

 

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

未完待续.....

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

网站:www.isno.cn
MSN:[email protected]
转载请注明作者及出处www.isno.cn

 
 
[......]

继续阅读

Linux 用户(user)和用户组(group)管理概述

一、理解Linux的单用户多任务,多用户多任务概念;

Linux 是一个多用户、多任务的操作系统;我们应该了解单用户多任务和多用户多任务的概念;

1、Linux 的单用户多任务;

单用户多任务;比如我们以beinan 登录系统,进入系统后,我要打开gedit 来写文档,但在写文[......]

继续阅读

UBuntu中增加中文字符编码的方法

UBuntu中增加中文字符编码的方法

在Widnows XP下的FTP服务器中有中文文件名,今天使用ftp命令,发现不能显示中文文件名,只能显示????。于是到网上查了一些资料,也没有找到好的解决方法,只是有人说使用图形化的ftp工具 gftp,安装方法:sudo apt-get instal[......]

继续阅读