Discuz:插件代码的安全规范

来自站长百科
跳转至: 导航、​ 搜索

Discuz! 6.0|Discuz! 6.0安装|Discuz! 6.0使用|Discuz! 6.0风格模板|Discuz! 6.0插件|Discuz! 6.0升级|Discuz! 6.0开发|Discuz! 6.0 FAQ

Discuz插件代码的安全规范,总的来说 PHP 还是相对安全的 Web 程序,但是由于一些代码在处理方式上的不成熟导致了安全隐患.由于这个议题范围太广,所以推荐 PHPCHINA 的Essential PHP Security -PHP安全基础 一书给大家,希望对大家有帮助。更详细的 PHP 安全信息可以登录 php.net 查找。

那么,对于插件安全究竟我们要做些什么怎么做?

1、变量的初始化

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

2、逻辑关系清楚

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

3、' '与" "的区别运用

单引号中,任何变量($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”;

4、数据的过滤与处理

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

5、不要相信任何数据的准确性和正确性

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

6、不要妄图直接把低版本的 Discuz! 插件直接运行

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

参考来源[ ]

Discuz! 6.0使用手册导航

Discuz! 6.0安装:

Discuz! 6.0产品概况| Discuz! 6.0环境要求| Discuz! 6.0安装详细过程| Discuz! 6.0文件及目录结构| Discuz! 6.0安装的常见问题| 附录 如何在Discuz上安装个人空间SupeSite/x-space指南| 附录 论坛一键式安装Discuz!EXP及EasyDiscuz指南| 附录 discuz本地运行环境构建(windows)

Discuz! 6.0使用:

Discuz! 6.0日常使用| Discuz! 6.0 config.inc.php配置问题| Discuz! 6.0前台管理操作说明| Discuz! 6.0用户权限设定| Discuz! 6.0服务器相关| Discuz! 6.0后台基本设置| Discuz! 6.0后台论坛管理| Discuz! 6.0后台用户管理| Discuz! 6.0后台帖子管理| Discuz! 6.0后台扩展设置| Discuz! 6.0后台其它设置| Discuz! 6.0后台社区营销| Discuz! 6.0后台系统工具

Discuz! 6.0风格模板

Discuz!6.0风格制作| Discuz!6.0界面风格与模板定制| Discuz!6.0风格高级应用| Discuz!6.0头部模板header详解| Discuz!6.0页脚模板footer详解

Discuz! 6.0插件

Discuz!6.0插件简介| Discuz!6.0插件安装| Discuz!6.0插件列表

Discuz! 6.0升级

Discuz!6.0升级指南| Discuz!6.0阶段升级说明| Discuz!6.0版本更新记录

Discuz! 6.0开发

Discuz!6.0插件设计 | Discuz!6.0插件设置及管理| Discuz!6.0插件的钩子使用技巧| Discuz!6.0插件代码的安全规范| Discuz!6.0PassPort接口技术文档

Discuz! 6.0 FAQ

Discuz!6.0经验技巧| Discuz!6.0防御CC攻击说明| Discuz!6.0搜索引擎优化| Discuz!6.0论坛程序