3

我正在使用下面的代码来自动加载和声明类,因此我只需要将类文件放在名为 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代码的文件名?但我认为它不会危及系统。

4

2 回答 2

6

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

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

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

于 2012-09-04T00:21:49.423 回答
2

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

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

以防万一,拒绝任何使用“类”或其他关键字,或任何内置类名,或内置函数名,其他内置函数等运行代码的尝试,你应该没问题,但即使这样也可能是在您的特定情况下没有必要,因为可能会导致错误。

于 2012-09-04T00:18:47.907 回答