【发布时间】:2014-10-15 18:51:02
【问题描述】:
我正在构建一个基于模块的 CMS,管理员还可以在其中创建自定义模块(以及预定义模块)。自定义模块接受将在显示模块时评估的 PHP 代码。只有管理员(单数或复数)可以编辑此代码,并且只能在管理页面上。*然后将模块的脚本存储在数据库中。
假设,例如,一个自定义模块的编写方式是它从数据库中查询一些信息——如果你愿意的话,这是一条给管理层的旧消息——到一个变量中,当然现在是用户提交的数据.如果这些数据包含恶意 php 代码,是否有可能以某种方式执行?还是 eval 处理变量的方式与处理原生 PHP 代码的方式相同?
我提供了一个示例,管理员编码以列出所有用户提交的消息。
需要 eval() 的 PHP 代码
$result = mysqli_query($con, "SELECT msg FROM messages;");
while ($message = mysqli_fetch_array($result))
{
echo $message['msg'];
}
如果$message['msg'] 变量之一是"; echo "you are screwed"; rmdir('root'),会执行还是回显?
*我知道如果数据库遭到破坏,或者代码明确允许用户覆盖其内容,“任何人”都可以编辑代码,但当然强烈建议不要这样做。我已经为这些留下了几个警告。
【问题讨论】:
-
就像您在普通文件中拥有该代码一样安全。如果把 PHP 搞砸那么容易,那么你可能只是问你的问题就把它搞砸了:p
-
@NiettheDarkAbsol 我怀疑stackoverflow的答案是使用评估脚本显示的。我真诚地希望你是对的,但我想确定一下。上面的 PHP 代码不在文件中,而是在数据库中。从数据库中查询后,脚本会被评估,但在这种情况下,它包含来自不受信任的用户输入的变量。