discuz源码研究—发帖

实现了浏览栏目列表和帖子列表之后,下面最重要的就是实现发帖功能,先看了看论坛网页版的html代码,提取出下面这些有用的代码:

<html>
    <head>
    <script src="http://112.74.102.213/static/js/forum.js?A6S" type="text/javascript"></script>
    <meta charset="utf-8">
    </head>      
    <body>
        <form method="post" autocomplete="off" id="fastpostform" action="http://112.74.102.213/forum.php?mod=post&amp;action=newthread&amp;fid=2&amp;topicsubmit=yes&amp;infloat=yes&amp;handlekey=fastnewpost">
    <input type="text" id="subject" name="subject" />
    <textarea rows="6" cols="80" name="message" id="fastpostmessage" tabindex="12" ></textarea>
    <input id='hash' type="hidden" name="formhash" value="c21b9112" />

    <p class="ptm pnpost">
        <button type="submit" name="topicsubmit" id="fastpostsubmit" value="topicsubmit" tabindex="13" class="pn pnc"><strong>发表帖子</strong>
        </button>
    </p>
</form>     

</body>

</html>

表单提交到的位置要根据自己的服务器ip来定:

action="http://112.74.102.213/forum.php?mod=post&amp;action=newthread&amp;fid=2&amp;topicsubmit=yes&amp;infloat=yes&amp;handlekey=fastnewpost">

但forum.php及后面的内容不要轻易修改,除了fid=2之外,这个是你要发帖的栏目编号

除此之外,里面最重要的部分就是formhash的值,这个值是在登录之后服务器分配给当前页面的一个验证值,用于判断表单的来路是否正确,简单说就是防止恶意发帖。
我们可以手动生成它

生成formhash

先来看看discuz内部是怎么生成这个值的,源码位于source/function/function_core.php,下面是实现方法:

function formhash($specialadd = '') {
    global $_G;
    $hashadd = defined('IN_ADMINCP') ? 'Only For Discuz! Admin Control Panel' : '';
    return substr(md5(substr($_G['timestamp'], 0, -7).$_G['username'].$_G['uid'].$_G['authkey'].$hashadd.$specialadd), 8, 8);
}

关键的四个值:

$_G['timestamp']
$_G['username']
$_G['uid']
$_G['authkey']

我们只需要关心最后一个值就好,原因:
第一个值是当前访问的时间戳,由服务器自动分配
第二和第三个值是当前登录用户的用户名和uid,在验证登录后这个值也会被填充,最后只剩下authkey,注意不是discuz_auth_key
需要两个全局变量:
$_G['config']['security']
和 $_G['cookie']['saltkey']

第一个变量,在安装了discuz之后,在config/config_global.php中有这个值,是一个长度为15的字符串,第二个变量说实在不知道在哪里设置的,反正可以读出来就是了,生成方式:

$key=$_G['config']['security']['authkey'];

$saltkey=$_G['cookie']['saltkey'];

$myauthkey=md5($key.$saltkey);

可以先从全局变量里读出authkey,再和我们生成的authkey比较,相同则表示成功了。
有了authkey,生成formhash就简单了
另外,需要注意的是,要使用$_G的全局变量,需要引入function_core.php

你可能感兴趣的:(discuz)