Я пытаюсь создать функцию, которая будет блокировать доступ к некоторым из моих низкоуровневых каталогов. Например, при создании моего сайта я не хочу разрешать загрузку ниже, чем /var/www/html/site/uploads/, если я допущу ошибку при написании кода. Это также поможет предотвратить опечатку при удалении каталога при удалении файлов кеша или чего-либо еще.
Это легко сделать с помощью realpath() и strcasecmp().
Проблема в том, что я не могу использовать realpath() для создания абсолютного пути, потому что любые вызовы этой функции с несуществующими каталогами вернут FALSE. Ниже моя лучшая попытка посмотреть пути для их проверки.
function is_sub_dir($path = NULL, $parent_folder = NULL) {
//Convert both to real paths
//Fails if they both don't exist
//$path = realpath($path);
//$parent_folder = realpath($parent_folder);
//Neither path is valid
if( !$path OR !$parent_folder ) {
return FALSE;
}
//Standarize the paths
$path = str_replace('\\', '/', $path);
$parent_folder = str_replace('\\', '/', $parent_folder);
//Any evil parent directory requests?
if(strpos($path, '/..') !== FALSE) {
return FALSE;
}
//If the path is greater
if( strcasecmp($path, $parent_folder) > 0 ) {
return $path;
}
return FALSE;
}
//BAD FOLDER!!!
var_dump(is_sub_dir('/var/www/html/site/uploads/../', '/var/www/html/site/uploads/'));
Кто-нибудь знает, как правильно установить блоки путей к файлам для защиты от низкоуровневого доступа к папкам?
:ОБНОВЛЕНО:
Далее я хочу пояснить, что этот метод проверки будет использоваться на нескольких серверах, а также при создании каталогов выше заданного каталога.
Например, в моем каталоге загрузок я хочу разрешить администраторам создавать новые подкаталоги, такие как ...uploads/sub/. Выяснив надежный способ гарантировать, что указанный каталог на самом деле выше, чем родительский каталог, я могу чувствовать себя в большей безопасности, позволяя своим администраторам работать с файловой системой в папке загрузки.
Поэтому, поскольку мне может потребоваться убедиться, что uploads/sub выше, чем uploads/, прежде чем я создам его, я не могу использовать realpath(), потому что uploads/sub< /strong> больше не существует.
Что касается фактического местоположения папки загрузки, которая вычисляется PHP на лету.
define('UPLOAD_PATH', realpath(dirname(__FILE__)));
: ОБНОВЛЕНИЕ 2:
У меня есть идея, что если бы я использовал realpath для сравнения всего пути за вычетом последнего сегмента каталога. Тогда, даже если этот последний сегмент каталога все еще необходимо создать, остальную часть пути можно заставить соответствовать минимальному родительскому каталогу?