3

我正在查看一些基本的 PHP 代码,这些代码通过 ajax 调用从 POST 数据中获取字符串。POST 数据用于直接实例化名称与 POST 字符串的值等效的类。假设类自动加载器所做的所有事情都是在找不到类时抛出错误或异常,那么恶意用户会在这里造成什么伤害?

POST 一个需要参数的标准 PHP 类名,或者 POST 'stdClass' 除了阻止返回视图外,不会做太多事情。除此之外,还有什么可能?此外,当添加新的视图类时,验证和保持灵活性的最佳方法是什么。

require_once('autoloader.php');

if(!empty($_POST['viewRequst'])){

    try{       

        $requestedView = $_POST['viewRequest'];

        $view = new $requestedView();

        $view->outputPage();

    }catch(Exception $e){

        /** 
        Perform Some Logging
        **/

    }

}else{

    echo "Data Error"; 

}
4

1 回答 1

1

您可能不想根据用户数据创建任意对象,因为这会导致对象注入

我建议为类的名称设置一个白名单,例如

/* a global function or part of a library */
function getValidPostClassName($str)
{
    switch($str) {
        case 'Something':
        case 'SomethingElse':
            return $str;
        default:
            throw new Exception("Security error!");
    }
}

$requestedView = getValidPostClassName($_POST['viewRequest']);
$view = new $requestedView();

我个人也不会设计我的应用程序来让用户变量对对象实例化进行任何控制。

于 2015-02-25T12:31:39.637 回答