现在注册赶紧抢单赚钱,刷单预约赚钱哦! 您需要 登录  才可以下载或查看,没有账号?立即注册  
 
x 
 
为了能让更多的人加入到编写插件的队伍中来,避免由于编写不规范而引起论坛安全问题.写了这么一个文档,希望对插件作者和对插件有浓厚兴趣的有多帮助。前面泡哥已经写过一个关于怎么写插件的帖子了(http://www.discuz.net/thread-315307-1-1.html ),当时写的是Discuz4.x的,关于Discuz5一直没更新,我就补上我这篇.有什么建议欢迎大家讨论.http://image.edbiji.com/doccon/20150115/20150115164448_352769_847.jpg  http://image.edbiji.com/doccon/20150115/20150115164448_636271_847.jpg  http://image.edbiji.com/doccon/20150115/20150115164449_415618_847.jpg  http://image.edbiji.com/doccon/20150115/20150115164449_883897_847.jpg  http://image.edbiji.com/doccon/20150115/20150115164450_777923_847.jpg  appid                     申请ID  <?php If(!defined('IN_DISCUZ')) {         Exit('Access Deined'); } 复制代码 建议:在每个插件程序的开头加上上面的代码.这是为了防止禁止直接外部访问文件 @include_once DISCUZ_ROOT.'./forumdata/cache/plugin_apply.php'; 复制代码 调用DISCUZ生成的插件参数的缓存文件.调用缓存文件以后,就可以调用里面的变量了. $applycount = $_DPLUGIN['apply']['vars']['applycount']; $lowestregdates = $_DPLUGIN['apply']['vars']['lowestregdates']; $integral = $_DPLUGIN['apply']['vars']['integral']; $extcredit = $_DPLUGIN['apply']['vars']['extcredit']; $lowestposts = $_DPLUGIN['apply']['vars']['lowestposts']; 复制代码 到这里插件的初始化就完成了.在继续我们的插件编写之前.我先介绍一下Discuz对变量是怎么处理,怎样才写出安全的插件. $magic_quotes_gpc = get_magic_quotes_gpc(); @extract(daddslashes($_COOKIE)); @extract(daddslashes($_POST)); @extract(daddslashes($_GET)); if(!$magic_quotes_gpc) {         $_FILES = daddslashes($_FILES); } function daddslashes($string, $force = 0) {         if(!$GLOBALS['magic_quotes_gpc'] || $force) {                 if(is_array($string)) {                         foreach($string as $key => $val) {                                 $string[$key] = daddslashes($val, $force);                         }                 } else {                         $string = addslashes($string);                 }         }         return $string; } 复制代码 这两段的代码功能就是在magic_quotes_gpc为off的情况,对$_GET,$_POST,$_COOKIE的值以及数组里面的每个值都进行转义,因为在magic_quotes_gpc为On时PHP本身自动会对这几个全局的变量进行转义,这些具体的内容介绍,可以看一下PHP相关的资料.这里需要强调的一点: dhtmlspecialchars                对html标签进行转义  
OK,现在可以进行核心代码的编写了. if(!$discuz_uid) {         showmessage('not_loggedin','logging.php?action=login'); } 复制代码 $applys = $apply = $applylist = ''; $page = !ispage($page) ? 1 : $page; $start_limit = ($page - 1) * 10; 复制代码 这是将要用到的变量的初始化和分页的处理,你可以搜索一下DZ处理分页的函数ispage(),multi(),他会生成一个分页的代码,注意:记得对变量初始化,这是一个好的习惯,也可以避免安全问题。  if($action == 'apply') {                //申请斑竹         $query = $db->query("SELECT count(appid) FROM cdb_plugin_apply WHERE uid='$discuz_uid'");  //查看申请用户的申请次数         $applys = $db->result($query,0);                //$db->result($query,0)可以用来取得一个记录值         if($applys >= $applycount) {                        //判断是否申请次数                 showmessage('你已经到达了申请的最多次数,请耐心等待管理员的审核','plugin.php?identifier=apply&module=apply');         } else {                 require_once DISCUZ_ROOT.'./include/forum.func.php';        //包含相关与论坛帖子相关的文件。这里因为下面的forumselect()函数需要用到                 require_once DISCUZ_ROOT.'./forumdata/cache/cache_forums.php';                 $forumselect = "<select name=\"fid\">\n<option value=\"\">  >请选择版块</option><option value=\"\"> </option>".str_replace('%', '%%', forumselect()).'</select>';                //这里是生成下拉采单式的版块选择,你可以看看DZ的操作方式                 include_once DISCUZ_ROOT . './plugins/apply/apply/apply.php';        //到apply目录下用对应的程序来处理申请的过程         } } elseif ($action == 'del') {                //这里是删除用户申请的过程         if($discuz_uid == $uid || $admin == 1 && $formhash == FORMHASH) {        //只有用户和管理员才有权限删除                 $db->query("DELETE FROM cdb_plugin_apply WHERE uid='$discuz_uid' AND fid='$fid'");                 showmessage('操作成功','plugin.php?identifier=apply&module=apply');         } else  {                 showmessage('禁止非法操作');         } } else {         $query = $db->query("SELECT * FROM cdb_plugin_apply LIMIT $start_limit,10"); //取得记录,并格式化时间         while($apply = $db->fetch_array($query)) {                 $apply['dateline'] = gmdate("$dateformat $timeformat", $apply['dateline'] + $timeoffset * 3600);                 $applylist[] = $apply;         }         $query = $db->query("SELECT COUNT(*) FROM cdb_plugin_apply");                //分页显示         $applynum = $db->result($query,0);         $multipage = multi($applynum, 10, $page, "plugin.php?identifier=apply&module=apply");         include template('apply'); } 复制代码 到这里apply.inc.php文件已经可以说是写完了。有什么问题,跟贴提问吧。 
上面当你访问插件的时候,初始化文件已经写完了 <?php if(!defined('IN_DISCUZ')) {         exit('ACCESS Diened'); } $total = $userinfo = ''; $query = $db->query("SELECT count(uid) FROM cdb_plugin_apply WHERE uid='$discuz_uid'"); $total = $db->result($query,0); $query = $db->query("SELECT posts,$extcredit,regdate FROM {$tablepre}members WHERE uid='$discuz_uid'"); $userinfo = $db->fetch_array($query); $userinfo['regdate'] = $timestamp - $userinfo['regdate']; $userinfo['regdate'] = ceil($userinfo['regdate'] / (3600*24)); if(submitcheck('forumsubmit')) {         if($userinfo['regdate'] < $lowestregdates || $userinfo[$extcredit] < $integral || $userinfo['posts'] < $lowestposts) {                 showmessage('请仔细查看申请斑竹的条件','plugin.php?identifier=apply&module=apply&action=apply');         }                  $query = $db->query("SELECT name FROM {$tablepre}forums WHERE fid='$fid'");         $fname = $db->result($query,0);         if(empty($fname)){                 showmessage('请选择正确的版块','javascript:history.go(-1)');         } else {                 $query = $db->query("SELECT COUNT(*) FROM cdb_plugin_apply WHERE uid='$discuz_uid' AND fid='$fid'");                 if($db->result($query,0)) {                         showmessage('请不要重复申请相同的版块','javascript:history.go(-1)');                 }         }                  if(empty($nettime)) {                 showmessage('上网时间不能为空','javascript:history.go(-1)');         } else {                 $nettime = intval($nettime);         }                  if(!empty($description) && strlen($description) >= 16) {                 $description = nl2br(dhtmlspecialchars($description));         } else {                 showmessage('自我介绍不能为空,或者少与16个字','javascript:history.go(-1)');         }                  if(!(empty($suggest) && strlen($suggest) >= 16)) {                 $suggest = nl2br(dhtmlspecialchars($suggest));         } else {                 showmessage('建议不能为空,或者少于16个字','javascript:history.go(-1)');         }                  $db->query("INSERT INTO cdb_plugin_apply (`uid`,`username`,`fid`,`fname`,`suggest`,`description`,`nettime`,`dateline`,`agreeapply`)                  VALUES ('$discuz_uid','$discuz_user','$fid','$fname','$suggest','$description','$nettime','$timestamp','$agreeapply')");         showmessage('请耐心等待管理的审核','plugin.php?identifier=apply&module=apply'); }  include template('apply'); ?> 复制代码 这次先不加注释,大家先自己看看,看看常用的函数会不会使用了。哪里不懂的。提问,我会及时回复的。