我正在查看一些基本的PHP代码,它通过ajax调用从POST数据中获取字符串。 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";
}
答案 0 :(得分:1)
您可能不想根据用户数据创建任意对象,因为这会导致Object Injection。
我建议使用类名称的白名单,例如
/* 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();
我个人也不会设计我的应用程序来为用户变量提供对对象实例化的任何控制。