Так же на том, что сказал Justin, но необходимо сделать это вместо этого:
Integer.toString(myInt);
Это сохраняет выделение или два и более читаемо.
Не проходите полный путь через строку заголовка, но вместо этого используйте базовое имя ( $ 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);
}
Никогда. Если браузер принимает полные пути, пора немедленно сообщить об ошибке: это будет серьезной дырой в безопасности.
Не передавайте полный путь через строку заголовка, а используйте вместо него базовое имя ( $ myad
).
Вам действительно следует использовать лучшую проверку для $ _ GET ['myad']
, поскольку ваш скрипт будет передавать произвольные пути пользователю ( readfile ()
получает нефильтрованный ввод пользователя). Это дыра в безопасности!
Вычислите реальный путь, используя realpath
, убедитесь, что файл находится в разрешенной папке, затем используйте basename ()
в полном пути, чтобы получить простое имя файла. Передайте эту подстроку через заголовок Content-Disposition
, но используйте реальный путь для readfile ()
.
ОБНОВЛЕНИЕ: Ваш обновленный код все еще содержит дыру в безопасности. Если $ _ GET ['myad']
содержит ../../ ..