PHP - Как установить полный путь к каталогу в Довольном Расположении?

Так же на том, что сказал Justin, но необходимо сделать это вместо этого:

Integer.toString(myInt);

Это сохраняет выделение или два и более читаемо.

5
задан John M 18 November 2009 в 17:21
поделиться

3 ответа

Не проходите полный путь через строку заголовка, но вместо этого используйте базовое имя ( $ myad ).

Вам действительно следует использовать лучшую проверку для $ _ GET ['myad'] , поскольку ваш сценарий будет передавать произвольные пути пользователю ( readfile () получает нефильтрованный ввод пользователя). Это дыра в безопасности!

Рассчитайте реальный путь, используя realpath , убедитесь, что файл находится в разрешенной папке, затем используйте basename () в полном пути, чтобы получить простое имя файла. Передайте эту подстроку через заголовок Content-Disposition , но используйте реальный путь для readfile () .


ОБНОВЛЕНИЕ: Ваш обновленный код все еще содержит дыру в безопасности. Если $ _ GET ['myad'] содержит ../../../ some / full / path , ваш сценарий с радостью отправит клиенту любой запрошенный читаемый файл.

Вам следует использовать что-то вроде следующего фрагмента:

$myad = $_GET['myad'];

$rootDir = realpath('/mit/mit_tm/mrl_bol');
$fullPath = realpath($rootDir . '/' . $myad);

// Note that, on UNIX systems, realpath() will return false if a path
// does not exist, but an absolute non-existing path on Windows.
if ($fullPath && is_readable($fullPath) && dirname($fullPath) === $rootDir) {
    // OK, the requested file exists and is in the allowed root directory.
    header('Content-Type: application/excel');
    // basename() returns just the file name.
    header('Content-Disposition: attachment; filename=' . basename($fullPath));
    readfile($fullPath);
}
9
ответ дан 18 December 2019 в 07:30
поделиться

Никогда. Если браузер принимает полные пути, пора немедленно сообщить об ошибке: это будет серьезной дырой в безопасности.

3
ответ дан 18 December 2019 в 07:30
поделиться

Не передавайте полный путь через строку заголовка, а используйте вместо него базовое имя ( $ myad ).

Вам действительно следует использовать лучшую проверку для $ _ GET ['myad'] , поскольку ваш скрипт будет передавать произвольные пути пользователю ( readfile () получает нефильтрованный ввод пользователя). Это дыра в безопасности!

Вычислите реальный путь, используя realpath , убедитесь, что файл находится в разрешенной папке, затем используйте basename () в полном пути, чтобы получить простое имя файла. Передайте эту подстроку через заголовок Content-Disposition , но используйте реальный путь для readfile () .


ОБНОВЛЕНИЕ: Ваш обновленный код все еще содержит дыру в безопасности. Если $ _ GET ['myad'] содержит ../../ ..

9
ответ дан 18 December 2019 в 07:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: