PHP eval in eval 无法读取预定义变量

PHP eval in eval cannot read predifined variables

在我解释这个问题之前,我知道使用 eval 的风险,但是对于我的系统是如何构建的,没有其他真正的方法可以做到这一点,而且它也仅适用于个人项目。 (它是一个自定义的 cms,当我发布它时,它会为我制作物理文件,我只是通过数据库制作它,所以我不需要在不远程工作时上传文件,这很容易)。

让我们解释一下我的问题,我有一个处理所有页面的主 php 文件,所有页面都与代码一起存储在数据库中,并且正在通过 eval 执行。 并且系统还有一个函数 include_db 基本上与 include from php normaly 只是从 db.

但是当我访问第一个 eval(主页)中定义的变量时,它无法从数据库中包含的 eval 中读出。 奇怪的是,可以通过第二个 eval 读出函数。

有什么方法可以正常访问主页评估中生成的包含评估中的变量? (我认为它必须这样做,因为这些变量不是全局变量并且它在函数中执行但我不知道如何使每个变量成为全局变量:( )

提前致谢!

主页上正在评估的代码:

$skill = isset($_REQUEST['skill']) && is_string($_REQUEST['skill']) && isValidSkill($_REQUEST['skill']) ? $_REQUEST['skill'] : 'overall';

if(!isset($_REQUEST['player']))
    include_db('highscore_overview');
else
    include_db('highscore_player');

在概述的包含中,我转储了 get_defined_vars() 并且 return 我在包含之前设置的 $skill 仅包含在 main [= 中声明的变量26=](数据库等)

首先免责声明:您永远不应该从数据库中执行代码。这是一个很大的安全风险。这意味着只要有人成功访问您的数据库(例如使用 sql 注入),现在也可以通过更改数据库中的代码在 php 中执行任意代码。 你真的不应该那样做!

如果您使用数据库中的代码来实现自定义(电子邮件)模板,请考虑使用模板引擎,例如 twig。模板引擎的大多数语法都是以一种你无法突破它们并执行任意代码的方式构建的,就像你可以使用原始 php 代码一样。

也就是说,我现在试着回答原来的问题(因为我无法阻止你做你不应该做的事情)。就变量作用域而言,eval 的行为类似于函数。如果你想在它里面定义的变量是全局的,你必须手动使 eval 中定义的每个变量成为全局变量。

您可以通过将代码片段附加到 eval 中执行的每个代码来实现,该代码片段获取每个本地(在 eval 中定义的)变量并将其写入全局范围。

<?php
function include_db() {

    # ... get $code from db here ...

    # get's executed after code from db, globalizes all variables
    $code .= ';foreach (get_defined_vars()) as $newGlobalName) {';
    $code .= '    $GLOBALS[$newGlobalName] = $$newGlobalName;';
    $code .= '}';

    eval($code);
}