浅谈如何保证discuz插件安全

时间:2023-08-03 14:18:38

1.非直接执行程序请加上

if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}

2.记得过滤

比如说uid等id需要intval过滤,避免溢出
    文字内容需要htmlspecialchars过滤避免内容变形(DZ内为dhtmlspecialchars)

3.查询条件需要写在'和'中间.

这个是为了避免别人使用查询的条件写出溢出内容

4.所有写入mysql的变量必须addslashes

DZ内为daddslashes,如用DZ无须再次过滤,DZ已将所有$_POST和$_GET过滤,并记得在插入时前后带上'

这是为了避免破第3步将变量内带'使第3条无效
    再需要选择是否插入某字段时记得不要直接使用传递来的代码而是判断是否选上什么再加上,比如

if($click) {
$front = 'a, b ,c';
$back = "'$a', '$b', '$c'";
} else {
$front = $back = '';
}

然后在下面的插入内可以直接加上$front和$back

查询也类似.
    必须记得如果没有将$front和$back为'',这是为了避免让别人利用了.

5.提交内容记得用submitcheck()
    避免被别人利用,比如利用[img]代码

6.确保所有变量都有定义,防止被别人利用
    DZ一直在改进,启用了很多新的变量也放弃了很多旧的变量,希望大家在转换过程中先了解清楚DZ是否有更改或去除以前的变量.
    比如说前段时间的许愿池漏洞就是因为没有定义$discuz_root而被别人利用.

7.extract,eval等函数需要小心使用
    不要被别人利用这个覆盖已有变量达到入侵目的

8.写储存文件的时候记得过滤
    如果你储存文件的后缀名为PHP或其他可执行文件,记得将开头加上

<?PHP
exit('Access Denied');
?>

9.可上传附件的插件记得限制类型

上传附件,为了防止他人上传可执行文件,必须检查后缀名是否含有可执行文件后缀名,最好不允许此类文件上传,如需上传请将文件名改变.
    以下内容转自DZ程序的代码

$attach['attachment'] .= preg_replace("/(php|phtml|php3|jsp|exe|dll|asp|aspx|asa|cgi|fcgi|pl)(\.|$)/i", "_\\1\\2",
substr($filename, , ).'_'.random().'.'.$extension);

10.所有组数在运用前记得写$xxx = array();
    这个的原因很简单,为了避免被利用(在地址直接加上&xxx[xxx]=abc即可被利用)
    有些插件有可能因为这些原因影响插件安全

代码审计名言:任何输入都是不可信的。