Discuz_COOKIE示例

[php] 2024-03-29 圈点311

摘要:Discuz_COOKIE简介,来源于网络的文章,简单的断了一下PHP的分句;基本理解其含意。

discuz的登陆机制

<textarea cols="50" rows="15" name="code" class="php">

&lt;form action='i_login.php'&gt;        user:&lt;input  name='username' type='text'&gt;        password:&lt;input name='password' type='password'&gt;        &lt;input type='submit' value='login'&gt; &lt;/form&gt;

</textarea> 


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


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

<textarea cols="50" rows="15" name="code" class="php">


&lt;?php

/** * 加载discuz的入口文件 当然你也可以不加 不过你得提出几个必要的函数 */

require_once './include/comon.inc.php';

$formUsername = trim($username);

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

// 接受POST传来的$password

/**

* 说下下面的secques

* secques呢 是论坛里的安全回答经过编码后提取的一段字符 虽然我们登陆的时候不会用到它

* 但是生成COOKIE呢 它还是不可或缺的滴 */

$query = $db-&gt;query("SELECT uid,password,secques FROM cdb_members WHERE username='$formUsername'"); $member = $db-&gt;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 { // 我们这里返回一个错误信息 告诉那个用户密码错误 }

?&gt;

</textarea>

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

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

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

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

<textarea cols="50" rows="15" name="code" class="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']) &amp;&amp; !$discuz_uid) { clearcookies(); }

$newpm = $newpmexists = $sessionexists = $seccode = $bloguid = 0;

if($sid) {

//存在$discuz_uid的话 根据uid取出用户信息 否则根据sid

if($discuz_uid) {

// 取用户信息

} else {

// 用sessions表中取用户信息

}

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


Discuz  COOKIE  

感谢反馈,已提交成功,审核后即会显示