Действительно, действительно опасно делать что-то вроде: opendir($local_directory)
, где $local_directory
- это значение, которое может исходить извне.
Что делать, если кто-то передает что-то вроде ../../../../../../../../../etc
... или что-то в этом роде? Вы рискуете поставить под угрозу безопасность своего хоста.
Вы можете взглянуть здесь, чтобы начать: http://php.net/manual/en/book.filter.php
ИМХО, если вы что-нибудь на лету не создавать, вы должны иметь что-то вроде:
$allowed_dirs = array('dir1','dir2', 'dir3');
if (!in_array($myvar, $allowed_dirs)) {
// throw an error and log what has happened
}
Вы можете сделать это сразу после получения вашего ввода от «снаружи». Если для вас нецелесообразно это делать, потому что количество графических серверов может меняться со временем, и вы боитесь потерять синхронизацию с вашей кодовой базой, вы также можете заполнить массив допустимых значений, создавая сканирование подкаталогов, которые у вас есть на изображении папки сначала.
Таким образом, в конце концов, вы могли бы иметь что-то вроде:
$allowed_dirs = array();
if ($handle = opendir(dirname(__FILE__) . '/images')) {
while (false !== ($entry = readdir($handle))) {
$allowed_dirs[] = $entry;
}
closedir($handle);
}
$myvar=$_GET['var'];
// you can deny access to dirs you want to protect like this
unset($allowed_dirs['private_stuff']);
// rest of code
$local_directory = dirname(__FILE__) . "/images/.$myvar";
if (in_array(".$myvar", $allowed_dirs) && $handle = opendir($local_directory)) {
$i=0;
while (false !== ($entry = readdir($handle))) {
if(strstr($entry, 'sample_'.$language.'-'.$type)) {
$result[$i]=$entry;
$i++;
}
}
closedir($handle);
} else {
echo 'error';
}
Код выше не оптимизирован. Но давайте избежим преждевременной оптимизации в этом случае (заявив об этом, чтобы избежать другого «приятного» понижения); фрагмент просто для того, чтобы вы поняли, что явным образом позволяю значения VS альтернативного подхода разрешать все, кроме соответствия определенного шаблона. Я думаю, что первое безопаснее.
Существует ли каталог '. $ Myvar', или вы создаете его на лету? –
@Pekka: Этот код ничего не создает на лету. –
Дезинфицирует все входы с помощью php-фильтров, этого должно быть более чем достаточно для вашего кода. http://br.php.net/manual/en/filter.filters.sanitize.php – B4NZ41