php: путь в строке запроса - лучший способ предотвратить взломы и ошибки? - PullRequest
1 голос
/ 21 октября 2010

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

Я передаю имена каталогов вместе с моим URL, как domain.com?p=folder/subfolder/etc

Я ищу лучший способ проверить, существует ли каталог, и я хочу (по крайней мере) как-то не дать людям подняться в иерархии.

Теперь то, что я делаю сейчас (почти), работает, однако я думаю, что есть гораздо лучший, более простой и короткий путь для этого:

    if(isset($_GET['p'])) {
    if (realpath($_GET['p'])) {
        if (substr(PATH, 0, 1) == "" || substr(PATH, 0, 1) == "/" || substr(PATH, 0, 2) == "./" || substr(PATH, 0, 3) == "../") {
            print "directory is forbidden!";
        } else {
            define(PATH, $_GET['p']); 
        }
    } else {
        print "directory does not exist!";
    }
} else { define(PATH, "root"); } 

что бы вы сделали?

1 Ответ

2 голосов
/ 21 октября 2010

Вы должны отображать пользовательский ввод в заранее определенный список допустимых имен файлов, а не разрешать использовать произвольные пути.

Сказав, что, если вы просто экспериментируете на персональной машине разработки, вы можете добавить любой предоставленный пользователем путь к пути к разрешенному базовому каталогу, чтобы предотвратить обход системы. Кроме того, запретите любые отправленные пути, которые содержат ./, ../ или ~/ (не только в начале строки, но и везде).

Для этого вы можете использовать preg_match .

if (preg_match('#(\./|\.\./|~/|\\\)#', $_GET['p'])) {
    // disallow
}

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

Кроме того, логика вашего кода имеет недостатки. PATH никогда не устанавливается перед его первым использованием, и даже если вы его установите, используется realpath, который экранирует путевые символы, что делает проверки substr неэффективными, и вы используете определение, где переменная является гораздо более подходящей .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...