Вы должны отображать пользовательский ввод в заранее определенный список допустимых имен файлов, а не разрешать использовать произвольные пути.
Сказав, что, если вы просто экспериментируете на персональной машине разработки, вы можете добавить любой предоставленный пользователем путь к пути к разрешенному базовому каталогу, чтобы предотвратить обход системы. Кроме того, запретите любые отправленные пути, которые содержат ./
, ../
или ~/
(не только в начале строки, но и везде).
Для этого вы можете использовать preg_match .
if (preg_match('#(\./|\.\./|~/|\\\)#', $_GET['p'])) {
// disallow
}
Опять же, это только для экспериментальных целей разработки. С любым кодом, предназначенным для реального использования, вы должны отобразить ввод в заранее определенный список допустимых путей.
Кроме того, логика вашего кода имеет недостатки. PATH
никогда не устанавливается перед его первым использованием, и даже если вы его установите, используется realpath
, который экранирует путевые символы, что делает проверки substr
неэффективными, и вы используете определение, где переменная является гораздо более подходящей .