第四节 数据库设计标准
对于数据库的设计我们同样由于篇幅和时间的关系我们不再多说,请仔细查看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!插件
第三章 Discuz!中常用变量说明
|