Intereting Posts
Использование переменной вне цикла while (scope) CakePHP: компонент Auth не входит в систему Отфильтровать раскрывающееся меню на основе другого выбора TinyMVC всегда показывает контроллер по умолчанию Uncaught exception «PDOException» с сообщением «не удалось найти драйвер» (для Oracle DB) Изменение цвета диаграммы диаграммы Google, когда ввод таблицы данных поступает из данных JSON с сервера Как выполнить миграцию на Laravel Artisan на AWAS Elastic Beanstalk? Fread намного медленнее для загрузки, чем readfile Этот результат представляет собой только результирующий набор только вперед, вызов rewind () после перемещения вперед не поддерживается – Zend Код для просмотра, если сайт не работает? Как удалить конечные нули в PHP Выравнивание по ширине букв с помощью sprintf Приращение значения в скрипте PHP не работает PHP: проверка нечувствительности к регистру Вызов Php Script с переменными POST UTF-8

Отправка переменных для функций файловой системы PHP с представлением формы

Я пытаюсь найти безопасный способ сделать следующее:

  1. Пользователи вводят значение в html-форму.
  2. Форма отправляется.
  3. PHP использует представленное значение в качестве аргумента для функции «scandir».

Моя теория включает логику в сценарии php, которая запрещает абсолютные пути и требует, чтобы имя каталога включало определенное значение.

Меня беспокоит, что хакер может использовать мою форму, чтобы представить свою собственную ценность и доступ к конфиденциальным файлам.

Это для плагина JQuery. Я не хочу, чтобы пользователи меняли файл PHP.

Как можно взломать нижний код?

<?php $foo = $_POST["some_directory"]; //validate $foo //make sure path to directory is relative $foo_url_test = parse_url($foo); if (isset($foo_url_test['scheme']) || isset($foo_url_test['host'])) { $foo = NULL; } //make sure the directory name contains 'bar123' $foo_name_test = preg_split('_[\\\\/]_', $foo); $foo_name_test = end($foo_name_test); $foo_name_test = strpos($foo_name_test,'bar123'); if ($foo_name_test === false) { $foo = NULL; } //make sure the path does not contain '..' $foo_dot_dot_test = strpos($foo,'..'); if ($foo_dot_dot_test == TRUE || $foo_dot_dot_test === 0) { $foo = NULL; } //get files $files_array = scandir($foo); ?> 

Вы можете посмотреть на realpath () .

 $foo = realpath($foo); if (substr($foo, 0, 8) != '/my/path') { return false; } 

…или что-то типа того.

Вероятно, вам нужно подробно остановиться на цели этого скрипта и почему он хочет читать произвольные каталоги. Без этих знаний трудно комментировать безопасность этого кода, кроме как указать на то, что это очень опасная вещь, без явных ограничений на доступные каталоги.

Я, например, никогда не установил PHP-скрипт на свой сервер, который позволяет удаленному злоумышленнику указать каталог для чтения – или даже узнать, существуют ли даже определенные файлы или каталоги.

Существует сильный аргумент в пользу ТРЕБОВАНИЯ пользователя для редактирования конфигурационного файла, прочитанного php, который позволяет владельцу сервера белым списком набор каталогов, разрешенных для открытия этим скриптом

Обновление после ответа от OP

Проблема, которую вы имеете здесь, в том, что все запросы «ajax» выполняются напрямую и из браузера. Это означает, что любые данные, которые веб-сервер устанавливает на странице html, которая делает запрос ajax, могут быть перезаписаны злоумышленником. Ваш запрос ajax может быть сделан кем угодно в любое время с любым параметром, если вы не закрепите его в противном случае.

Как только ваши данные покинут ваш сервер, вы больше не сможете доверять ему. Лучший способ сделать это безопасным – сохранить белый список разрешенных каталогов на стороне сервера. Если вы получаете запрос для каталога, который не находится в разрешенном списке (или, возможно, не находится в подкаталоге под чем-то в разрешенном списке), вы отклоняете запрос и даете стандартный ответ об ошибке.

Имя вашего каталога может содержать .. элементы, поэтому они могут смотреть вне текущего рабочего каталога, для которого вы предназначены, чтобы ограничить их. Тем не менее, они все равно смогут смотреть только на каталоги, названные вами.

FWIW, используя parse_url() чтобы проанализировать, является ли имя каталога относительным, действительно причудливо. Почему бы вам просто не поискать $foo[0] == '/' ?

(Это предполагает соглашение об Unix-пути, конечно, но ваш код уже делает это.)