本代码中的eval()如何不安全?

时间:2012-09-04 00:06:29

标签: php wordpress security eval

我正在使用下面的代码自动加载和声明类,这样我只需要将类文件放在名为classes的文件夹中。 spl_autoload_regsister()中的部分可能对您来说似乎没必要,但它需要作为WordPress插件工作而不会出错。

它使用eval(),我看到很多关于使用eval()的网页都很糟糕,可能会造成安全漏洞。那怎么会有危险呢?

$strDirPath = dirname(__FILE__) . '\\classes\\';
$arrClassFiles = array_map(create_function( '$a', 'return basename($a, ".php");' ), glob($strDirPath . '*.php'));
spl_autoload_register(
    create_function('$class_name', '
        global $arrClassFiles, $strDirPath;
        if (in_array($class_name, $arrClassFiles)) 
            include($strDirPath . $class_name . ".php");' )
);

foreach ($arrClassFiles as $strClassName) {
    $strClassName_alpha = $strClassName . "_Alpha";
    eval("class $strClassName_alpha extends $strClassName {};");    
}

print_r(get_declared_classes());    

也许,有人可以在文件夹中放入php代码的文件名吗?但我认为它不会影响系统。

2 个答案:

答案 0 :(得分:6)

如果他们可以将类文件命名为randomclass {}; echo $db_password;//.php,那么您可能会遇到代码执行攻击。

我很确定这不是一个有效的文件名,但是在制作有效的恶意输入时,有些人比我更有意思。

这通常不是你需要打开自己的攻击面,因为它实际上总是可以避免使用更好的代码结构。

答案 1 :(得分:2)

如果处理了错误情况,我在这里看不到问题。

请确保如果有人试图调用另一个确实存在的类(即代码在此处有效,但您不希望您的黑客直接运行,因为它会绕过您系统的限制),它不会成为一个安全问题 - 或者根本不可能在这个环境中运行该类。

以防万一,拒绝任何尝试使用" class,"或其他关键字,或任何内置的类名,或内置函数名,其他内置函数等,你应该没问题,但即使这可能在你的特定情况下是不必要的,因为可能会导致错误