【问题标题】:PHP eval - evaluate code that contains variablesPHP eval - 评估包含变量的代码
【发布时间】: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 代码不在文件中,而是在数据库中。从数据库中查询后,脚本会被评估,但在这种情况下,它包含来自不受信任的用户输入的变量。

标签: php eval


【解决方案1】:

在这种情况下,您只是选择并显示数据...因此附加的可能性较小...

$result = mysqli_query($con, "SELECT msg FROM messages;");

while ($message = mysqli_fetch_array($result))
{
    echo $message['msg'];
}

说是不是...

$result = mysqli_query($con, "SELECT msg FROM messages where some=".$get/post-some.";");

while ($message = mysqli_fetch_array($result))
{
    echo $message['msg'];
}

$getsome$getsome中可能存在sql注入攻击,比如在末尾附加'or 1=1'或其他类型...

所以你需要在传递值时使用PDOmysql_real_escape_string...或者只是准备好的语句...

【讨论】:

  • 感谢您的回答,但我感兴趣的是是否存在来自来自数据库的攻击可能性,该攻击可能会以某种方式修改代码的评估方式。跨度>
  • 既然您说代码仅由授权用户修改,那么他们中的任何人都可能希望系统崩溃以实现这种情况......
猜你喜欢
  • 1970-01-01
  • 2011-07-29
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多