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


How Can eval() in This Code Be Not Secure?

我使用下面的代码自动加载和声明类,这样我只需要将类文件放在名为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代码的文件名放在文件夹中?但我不认为这会损害整个系统。

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

我很确定这不是一个有效的文件名,但在制作有效的恶意输入方面,有些人比我狡猾得多。

这通常不是你需要面对的攻击面,因为实际上总是可以通过更好的代码结构来避免。

如果处理了错误条件,我认为这里没有问题。

只要确保如果有人试图调用一个确实存在的不同类(即在这里有效的代码,但你不希望你的黑客直接运行,因为它会绕过你系统上的限制),这不会是一个安全问题,或者根本不可能从这个上下文运行该类。

为了以防万一,拒绝任何使用单词"class"或其他关键字、任何内置类名、内置函数名、其他内置项等运行代码的尝试,你应该没事,但在你的特定情况下,这可能没有必要,因为这可能会导致错误。