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