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&action=newthread&fid=2&topicsubmit=yes&infloat=yes&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&action=newthread&fid=2&topicsubmit=yes&infloat=yes&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
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。