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

發佈了57 篇原創文章 · 獲贊 5 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章