PHP安全漏洞,用于对象实例化的未验证Post数据


PHP Security Vulnerability, Unvalidated Post data used for object instantiation

我正在研究一些通过ajax调用从POST数据中获取字符串的基本PHP代码。POST数据用于直接实例化一个类,该类的名称相当于POSTed字符串的值。假设类自动加载器所做的只是在找不到类的情况下抛出错误或异常,那么恶意用户会在这里造成什么伤害?

张贴一个需要参数的标准PHP类名,或者张贴"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"; 
}

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

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

/* 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();

就我个人而言,我也不会设计我的应用程序来给用户变量任何对对象实例化的控制。