Как очистить переменные $ _GET, чтобы предотвратить инъекцию пути?

Каков наилучший способ для дезинфекции запроса $_GET[''] ? Я хочу разрешить загрузку файлов только из одного каталога.

 $baseDir = "/home/html/xy.com/public_html/downloads/"; $path = realpath($baseDir . $_GET['file']); 

Каким будет следующий шаг?

Вот что я буду делать после строк, которые у вас есть:

 if (dirname($path) === $baseDir) { //Safe } 

http://php.net/dirname

В принципе, сделайте проверку перед отправкой всего, что файл на самом деле находится в том одном пути, который вы поддерживаете. Обратите внимание: вам также придется добавить свой собственный / перед именем файла (в $path ) и удалить его из определения $baseDir , так как dirname() не будет оставлять разделитель пути назад.

Вместо того, чтобы проверять, нет ли фрагментов относительного пути, проще просто снять их прямо сейчас. Просто используйте basename() сразу после получения значения:

 $baseDir = "/home/html/xy.com/public_html/downloads/"; $path = realpath($baseDir . basename($_GET['file'])); 

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

Прежде чем назначить $path $_GET в $path вам необходимо выполнить дезинфекцию.

Я рекомендую использовать собственные функции sanitize для PHP ( http://php.net/manual/en/function.filter-input.php и http://php.net/manual/en/filter.filters.sanitize.php ). Необходимо иметь PHP> = 5.2.0,