宝峰科技

 找回密码
 注册

QQ登录

只需一步,快速开始

智能终端设备维修查询系统注册会员邮箱认证须知!
查看: 2854|回复: 0

[插件开发资料] Discuz!的插件开发文档

[复制链接]
  • TA的每日心情
    开心
    2024-12-9 18:45
  • 签到天数: 124 天

    [LV.7]常住居民III

    admin 发表于 2014-12-8 23:14:01 | 显示全部楼层 |阅读模式

    欢迎您注册加入!这里有您将更精采!

    您需要 登录 才可以下载或查看,没有账号?注册

    x
    绪论 本文档的说明
    伴随着Discuz!的成长,在Discuz!快速发展的同时,Discuz!的插件也日益丰富,在这些插件中存在的不规范问题也是确实存在的,为了插件的规范化标准化进程的进行,也为了方便各位优秀的插件开发人员,更为了Discuz!程序插件的传承,我们特从现在开始进行插件开发标准化手册的编写,促进Discuz!论坛程序的插件开发!
    目前手册正在紧张的制作中,欢迎大家对其中不对的地方进行指正,个人感觉这个手册更新的速度那会是相当的快啊
    第一章 插件代码书写规范

            第一节 注释标准
    在Discuz!插件中我们建议开发人员尽量添加简洁明了的注释语言,以方便后继的插件修改者
    以下的几种注释都是支持的,我们建议使用第一种
    [PHP] 纯文本查看 复制代码
    <?php
    
    echo "这是第一种例子。\n"; // 本例是 C++ 语法的注释
    
    /* 本例采用多行的
    
    注释方式 */
    
    echo "这是第两种例子。\n";
    
    echo "这是第三种例子。\n"; # 本例使用 UNIX Shell 语法注释
    
    ?>


    第二节 缩进标准
    在Discuz!插件中我们建议开发人员尽量使用缩进来完成整个程序,虽然对于程序没有影响,但是缩进会使代码易于阅读,并且强烈建议使用Tab键来控制缩进的程度,并强制定义其距离是8个空白字符宽度
    [PHP] 纯文本查看 复制代码
    <?php
    
    if($loadctrl && (!defined('CURSCRIPT') || CURSCRIPT != 'wap') && substr(PHP_OS, 0, 3) != 'WIN') {
    
    if($fp = @fopen('/proc/loadavg', 'r')) {
    
    list($loadaverage) = explode(' ', fread($fp, 6));//请注意缩进
    
    fclose($fp);
    
    if($loadaverage > $loadctrl) {
    
    header("HTTP/1.0 503 Service Unavailable");//请注意缩进
    
    include DISCUZ_ROOT.'./include/serverbusy.htm';
    
    exit();
    
    }//请注意缩进
    
    }//请注意缩进
    
    }
    
    ?>


    第三节 命名标准
    良好的命名方式会给程序的开放带来很大的便利,同时不良的命名习惯也会给程序开发带来麻烦,所以在Discuz!插件中我们建议开发人员尽量使用规范的命名方式来完成整个程序,仍然以上例为演示,请注意其中变量名称,由于篇幅和时间的关系这里就不再展开叙述,这里给出一个PHP程序开发比较通用的命名习惯(这是一个编程标准文档)PHP 编程标准.总的来说,只有了解系统的程序员才能为系统取出最合适的名字,如果所有的命名都与其自然相适合,则关系清晰,含义可以推导得出,一般人的推想也能在意料之中,如果你发觉你的命名只有少量能和其对应事物相匹配的话, 最好还是重新设计吧
    [PHP] 纯文本查看 复制代码
    <?php
    
    if($loadctrl && (!defined('CURSCRIPT') || CURSCRIPT != 'wap') && substr(PHP_OS, 0, 3) != 'WIN') {
    
    if($fp = @fopen('/proc/loadavg', 'r')) {
    
    list($loadaverage) = explode(' ', fread($fp, 6));
    
    fclose($fp);
    
    if($loadaverage > $loadctrl) {
    
    header("HTTP/1.0 503 Service Unavailable");
    
    include DISCUZ_ROOT.'./include/serverbusy.htm';
    
    exit();
    
    }
    
    }
    
    }
    
    ?>


    第四节 数据库设计标准
    对于数据库的设计我们同样由于篇幅和时间的关系我们不再多说,请仔细查看Discuz!中的论坛版块表的设计和命名标准,同样的我们提供给您一份手册给您查看MySQL参考手册
    cdb_forums 论坛表
    fid smallint 论坛ID
    fup smallint 上级论坛ID
    type enum 类型
    name char 名称
    status tinyint 显示状态
    displayorder tinyint 显示顺序
    styleid smallint 风格ID
    threads mediumint 主题数量
    posts mediumint 帖子数量
    todayposts mediumint 今日发帖数量
    lastpost char 最后发表
    allowsmilies tinyint 允许使用表情
    allowhtml tinyint 允许使用html
    allowbbcode tinyint 允许bbcode
    allowimgcode tinyint 允许img
    allowanonymous tinyint 允许匿名
    allowshare tinyint 允许共享到文集和supe
    allowpostspecial tinyint 允许发表特殊主题
    alloweditrules tinyint 允许版主修改论坛规则
    recyclebin tinyint 是否启用回收站
    modnewposts tinyint 是否审核发帖
    jammer tinyint 是否启用干扰码
    disablewatermark tinyint 是否图片附件增加水印
    inheritedmod tinyint 本论坛或分类版主的权力继承到下级论坛
    autoclose smallint 自动关闭主题
    forumcolumns tinyint 增加论坛水平横排设置
    threadcaches tinyint 主题缓存功能设置
    allowpaytoauthor tinyint 允许直接向作者支付


    第二章 插件代码安全规范

            第一节 PHP安全信息
    总的来说PHP还是相对安全的Web程序,但是由于一些代码在处理方式上的不成熟导致了安全隐患.由于这个议题范围太广,所以推荐PHPCHINA的Essential PHP Security -PHP安全基础一书给大家,希望大家多看看,很不错的一本书哦,更详细的PHP安全信息请登录php.net查找.
    第二节 我们该怎么做
    对于插件安全究竟我们要做些什么怎么做?建议本内容在看过上节推荐的书之后再看会更好


    变量的初始化
    这里不讨论magic_quotes_gpc和register_globals的设置情况,大家只要注意不要“无中生有”变量,每个变量的得到都是自己初始化过的

    逻辑关系清楚
    对于逻辑的判定不是一句话能够说明白的,举个简单的例子,在判断上传文件的时候,我们判断的依据是他的后缀是否在我们允许的后缀里面,如果是允许的就执行上传,反之就提示上传文件后缀不对,但是如果用户上传的文件名是webshell.xxx.mht(允许mht文件上传,mht是一种网页存储格式),于是文件上传了,在apache系统的默认配置下,这个文件是会用PHP来解析的,利用这个算是BUG的问题吧,小版本人就曾伙同PHP安全界知名人士(帮他匿了)对我们学校的服务器完成了入侵,并最终取得了root权限(目前俺们学校的服务器已经修正此问题),举这个例子是为了说明程序处理的重要性,如果当时多一步判断上传的文件,也许这个安全问题就不再存在,其实这个例子来说明逻辑关系并不是很合适,但是程序处理真的是一个非常重要的部分

    ''与""的区别运用
    单引号中,任何变量($var)、特殊转义字符(如“\t \r \n”等)不会被解析,因此PHP的解析速度更快,转义字符仅仅支持“\’”和“\\”这样对单引号和反斜杠本身的转义;
    双引号中,变量($var)值会代入字符串中,特殊转义字符也会被解析成特定的单个字符,还有一些专门针对上述两项特性的特殊功能性转义,例如“\$”和“{$array[‘key’]}.这样虽然程序编写更加方便,但同时PHP的解析也很慢;
    数组中,如果下标不是整型,而是字符串类型,请务必用单引号将下标括起,正确的写法为$array[‘key’],而不是$array[key],因为不正确的写法会使PHP解析器认为key是一个常量,进而先判断常量是否存在,不存在时才以“key”作为下标带入表达式中,同时出发错误事件,产生一条Notice级错误.
    因此,在绝大多数可以使用单引号的场合,禁止使用双引号.依据上述分析,可以或必须使用单引号的情况包括但不限于下述:
    字符串为固定值,不包含“\t”等特殊转义字符;
    数组的固定下标,例如$array[‘key’];
    表达式中不需要带入变量,例如$string = ‘test’;而非$string = “test$var”;

    数据的过滤与处理
    对于任何得到的数据在不能确定或者不能充分确定其来路的时候一定要进行过滤与处理,在数据进入程序运行处理阶段之前,一定要保证它的准确性和正确性

    不要相信任何数据的准确性和正确性
    这条视乎是和上面一条雷同,但是即使是从数据库中查出来的数据也一样不能确定,比如生成cache文件,如果用户POST的数据错误不是我们期望的数据,而“恰巧”生成到文件中,于是一个webshell产生了,同样这个例子也不是很合适,我只是希望大家明白这么一点,如果我们没有一个很好的处理数据的方式,那么代码的安全崩溃也就指日可待

    不要妄图直接把低版本的Discuz!插件直接运行
    由于每个大版本的升级都会带来系统构架的一些变化,可能旧版本的插件仍然可以使用,但是或许一些不可预料的问题正在隐藏中,所以建议任何低版本的Discuz!插件最好是经过仔细研究之后再公告说可以适用新版本Discuz!插件。



    该贴已经同步到 admin的微博
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    免责声明

    本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。本站所发布的任何软件编程开发或软件的逆向分析文章、逆向分析视频、补丁、注册机和注册信息,仅限用于学习和研究软件安全的目的。全体用户必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。学习编程开发技术或逆向分析技术是为了更好的完善软件可能存在的不安全因素,提升软件安全意识。所以您如果喜欢某程序,请购买注册正版软件,获得正版优质服务!不得将上述内容私自传播、销售或者用于商业用途!否则,一切后果请用户自负!

    QQ|Archiver|手机版|小黑屋|联系我们|宝峰科技 ( 滇公网安备 53050202000040号 | 滇ICP备09007156号-2 )

    Copyright © 2001-2023 Discuz! Team. GMT+8, 2024-12-22 01:34 , File On Powered by Discuz! X3.49

    快速回复 返回顶部 返回列表