readfile () - разрешать загрузку только определенных типов файлов из определенных каталогов - PullRequest
1 голос
/ 24 марта 2011

У меня есть папки на веб-сайте, который я создаю, и я хочу, чтобы только зарегистрированные пользователи имели доступ к файлам с него. Итак, я решил использовать некоторые правила .htaccess и обработчик файлов PHP, чтобы я мог убедиться, что пользователи вошли в систему, прежде чем они смогут получить доступ к файлам. Обработчик файла примет ввод в виде "/download.php?file=filename.pdf". Я только хочу, чтобы пользователь мог загружать документы Word и PDF-файлы. Как сделать так, чтобы пользователи не могли злоупотреблять моим обработчиком файлов, загружая файлы типа .php для моего веб-сайта или загружая файлы вне этих каталогов?

Ответы [ 3 ]

0 голосов
/ 24 марта 2011

Во-первых, не предоставляйте имя загружаемого файла напрямую. Используйте какой-нибудь хешированный токен. В идеале вы должны хранить список всех возможных файлов в базе данных и использовать соленую + хешированную копию первичного ключа записи в качестве идентификатора файла на стороне клиента. Так что вместо

/download.php?filename=my_bank_password.txt

пользователь увидит

/download.php?id=235gdlhs987234rljfser23j8233r4

вместо.

А внутри скрипта download.php вы делаете соответствующие проверки - разрешено ли этому лицу просматривать файл, разрешено ли ему загружать этот тип файлов и т. Д. ... если это не так, вы выводите страницу с ошибкой , Если это так, вы выводите файл с соответствующим заголовком, чтобы они получили исходное имя файла, а не хэшированный мусор или «download.php»

0 голосов
/ 24 марта 2011

Ну, я собирался отметить, что это может быть небезопасно. Тем не менее, это распространенный тип программ. Обработчик файлов должен очистить ввод пользователя. Прежде всего, вы должны запустить свой веб-сервер под отдельной учетной записью с ограниченными возможностями. Таким образом, если хакер может попытаться получить доступ к вашей файловой системе, они уже серьезно ограничены. Затем вы должны изменить разрешения для всего, что находится за пределами папки загрузки.

Теперь у вас есть пара опций для очистки пользовательского ввода, для которого загружается файл.

Вы можете использовать Perl Regex, чтобы найти расширение.

Вы можете использовать pathinfo (), чтобы получить базовое имя и расширение ... таким образом, вы не открываете никакой директории (например, ../ или / home и т. Д.).

Вы можете присвоить каждому файлу идентификатор в базе данных, а затем вместо этого обработчик файла должен выполнить что-то вроде /download.php?file=12345, но вам придется очистить пользовательский ввод для базы данных.

0 голосов
/ 24 марта 2011

Санируйте значение перед тем, как предлагать файл для скачивания. Проверьте это для родительского обхода и проверьте расширение файла.

...