我使用下面的代码自动加载和声明类,这样我只需要将类文件放在名为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"或其他关键字、任何内置类名、内置函数名、其他内置项等运行代码的尝试,你应该没事,但在你的特定情况下,这可能没有必要,因为这可能会导致错误。