编辑更多信息 我在管理区域中有一个页面,用户可以在其中编写自己的PHP / HTML文件,以添加他们想要在其网站中使用的额外功能等。我有一系列“危险”的词来过滤掉任何与核心数据库表混淆的内容,例如能够编写恶意代码来删除成员表(例如)。
textarea / code区域获取内容并使用fwrite
将其全部放入PHP文件中,然后可以通过网站上的模板标记将其包含在内。
当文件被保存时,它会读取所有文本,并根据无法使用的单词“危险数组”进行检查(例如:exec,system,delete from,drop database等)。
但是我最近发现了一个缺陷,下面的变量可以放在文件中,然后可以使用mysql
命令:
$var = "DR" . "OP ". "TA" . "BL" . "E";
$sql = mysql_query($var tablename);
通过字符数组匹配检查所有文件内容在此方案中不起作用。
$dangerous = "/\b(exec|system|delete from|drop database)\b/i";
if (preg_match($dangerous, $code)) {
$tag_code = preg_replace($dangerous, '', $tag_code);
}
------- 结束编辑
我有一个函数可以检查一组“坏词”并在保存新的自定义用户生成文件时过滤掉它们(类似于this question所说的),但我发现它很容易就可以了通过将无效的单词与变量分开来避免。
例如,“DELETE FROM”是一个无效的短语,但如果使用以下内容制作文件:
$var = "DE" . "LET". "E " . "FR" . "OM";
阵列过滤器显然无法以通常的方式检测到这一点。问题是这些变量“hacks”可以任意组合编写,所以我不确定如何 - 或者 - 是否有办法在文件中检测这样的事情。
可以这样做吗?