我正在使用下面的代码自动加载和声明类,这样我只需要将类文件放在名为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代码的文件名吗?但我认为它不会影响系统。
答案 0 :(得分:6)
如果他们可以将类文件命名为randomclass {}; echo $db_password;//.php
,那么您可能会遇到代码执行攻击。
我很确定这不是一个有效的文件名,但是在制作有效的恶意输入时,有些人比我更有意思。
这通常不是你需要打开自己的攻击面,因为它实际上总是可以避免使用更好的代码结构。
答案 1 :(得分:2)
如果处理了错误情况,我在这里看不到问题。
请确保如果有人试图调用另一个确实存在的类(即代码在此处有效,但您不希望您的黑客直接运行,因为它会绕过您系统的限制),它不会成为一个安全问题 - 或者根本不可能在这个环境中运行该类。
以防万一,拒绝任何尝试使用" class,"或其他关键字,或任何内置的类名,或内置函数名,其他内置函数等,你应该没问题,但即使这可能在你的特定情况下是不必要的,因为可能会导致错误