我正在研究一些通过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();
就我个人而言,我也不会设计我的应用程序来给用户变量任何对对象实例化的控制。