Мой друг обнаружил проблему в моем скрипте, он дает доступ к корневым файлам.
Этот URL дает файл passwd:
http://site.com/attachment.php?file=../../../../../../etc/passwd
Как избежать этой дыры в безопасности?
Не загружайте файлы, используя строку URL .... Определите уникальные идентификаторы для обозначения файла, а не пути.
Вы могли видеть такие загрузки http://www.mysite.com/download.php?id=23423
что они делают, используйте этот идентификатор, чтобы извлечь имя файла и путь из БД, а затем загрузите его.
Вы можете использовать realpath ()
и dirname ()
для проверки URL-адресов на $ _ SERVER ['DOCUMENT_ROOT']
(или любой другой каталог, который является «безопасным» для скачивания).
Если результат realpath ()
указывает за пределы безопасного каталога, вы можете отклонить запрос на загрузку.
Также есть директива безопасности open_basedir (и параметр времени выполнения, начиная с версии 5.3).
Полагаю, у вас есть каталог, в котором хранятся все вложения.
Просто проверьте, находится ли файл в вашем каталоге.
// http://www.php.net/manual/en/function.basename.php
// http://cz.php.net/manual/en/function.file-exists.php
if (file_exists($attachments_path . "/" . basename($_GET['file'])) {
// do work
}
Starx опубликовал решение, которое выглядит нормально. Однако это можно сделать и без базы данных. Если кто-то загружает файл, вы можете сохранить его как md5($filename).$extension
и использовать свой скрипт.