is_file ($ _ GET) и безопасность - PullRequest
1 голос
/ 18 декабря 2010

Я использую этот код поверх моего PHP-файла для загрузки кэшированных файлов, и меня беспокоит, достаточно ли он безопасен:

//quick! load from cache if exists!
if (is_file('cache/'.($cachefile=basename('/',$_GET['f']))))
{
    header('content-type: text/css');
    require('cache/'.$cachefile);
    die(); //ALL OK, loaded from cache
}

РЕДАКТИРОВАТЬ: Я также хотел бы знать, если это не так, как это можно использовать и как переписать его безопасным способом.

РЕДАКТИРОВАТЬ 2: Я редактировал код из предыдущего кода, я не знаю, как я мог подумать, что is_file будет фильтровать плохие пути>. <</p>

РЕДАКТИРОВАТЬ 3: Еще раз изменил его, поэтому он использует basename() вместо end(explode()), а также изменил включение с повторения кода на присвоение значения переменной во время первого сравнения (или проверки файла).

Я никогда не просто include($_GET), но сегодня я почему-то думал, что is_file отфильтрует пути, которые могут повредить моей системе. Я не знаю как.

Спасибо

Ответы [ 3 ]

3 голосов
/ 18 декабря 2010

Я мог бы отправить $_GET['f'] = '../../database_passwords.xml' ...

Используйте basename, чтобы исключить что-либо, кроме последнего сегмента пройденного пути.В качестве альтернативы, создайте путь, затем вычислите абсолютный соответствующий путь и проверьте, находится ли он по-прежнему в пределах cache/.

2 голосов
/ 18 декабря 2010

BAD! * * 1001

А как же:

page.php?f=../../../../../etc/password

Никогда не делай таких вещей

Проверьте f по белому списку или определенному шаблону, например "[a-z] +. Php"

1 голос
/ 18 декабря 2010

Нет, это не так. Я мог бы поместить '../../anypath' в $_GET['f'] и получить доступ к любому файлу на вашем сервере, даже к тем, которые находятся за пределами вашего корневого каталога www.

[править] Было бы намного безопаснее, если бы вы проверили «/» и другие недопустимые символы в значении. Это довольно безопасно, если это имя файла содержит только буквенно-цифровые символы и . и _.

...