Я смотрю на некоторый базовый код PHP, который берет строку из данных POST через ajax-вызов. Данные POST используются для непосредственного создания экземпляра класса, имя которого эквивалентно значению строки POST. Предполагая, что все автозагрузчик классов создает ошибку или исключение, если он не может найти класс, какой вред может нанести злонамеренный пользователь здесь?
Размещение стандартного имени класса 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();
Лично я бы также не разработал свои приложения, чтобы когда-либо предоставлять пользовательским переменным какой-либо контроль над созданием объектов.
Других решений пока нет …