Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Скрытие расположения скачиваемого файла
Форумы портала PHP.SU » » Работа с файловой системой и файлами » Скрытие расположения скачиваемого файла

Страниц (1): [1]
 

1. Dragon_Knight - 28 Июня, 2013 - 20:14:08 - перейти к сообщению
Всем привет.

Есть задача скрыть папку, где находятся все файлы для скачки. Это простая и тривиальная задача.
PHP:
скопировать код в буфер обмена
  1. $file = $_GET['file'];
  2. if(file_exists($file) === TRUE)
  3. {
  4.         header('Content-Description: File Transfer');
  5.         header('Content-Type: application/octet-stream');
  6.         header('Content-Disposition: attachment; filename=' . basename($file));
  7.         header('Content-Transfer-Encoding: binary');
  8.         header('Expires: 0');
  9.         header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  10.         header('Pragma: public');
  11.         header('Content-Length: ' . filesize($file));
  12.  
  13.         ob_clean();
  14.         flush();
  15.         readfile($file);
  16.         exit;
  17. }

Но есть одно НО, которое нарушает безопасность как сайта так и сервера в целом:
Что мешает сделать так: download.php?file=../../config.php и уаля, сервер отдал нам конфиг файл...

Как сделать защиту от такого?
2. LIME - 28 Июня, 2013 - 20:17:13 - перейти к сообщению
а файлы любые? или с определенным расширением?
(Добавление)
в общем случае можно хранить их не под настоящим именем а под его хешем md5
тоесть приходит запрос на file.ext
преобразуешь его в хеш и отдаешь этот файл
3. Dragon_Knight - 28 Июня, 2013 - 20:19:56 - перейти к сообщению
Вообще там будут только MP3 файлы, но не очень хочется делать привязку к разрешению, но если других вариантов нету, то... Радость

ADD: Ситуация такая, что файлы будут попадать в папку через FTP, т.е заноситься в базу или где-то ещё отмечаться не будут.
4. LIME - 28 Июня, 2013 - 20:20:06 - перейти к сообщению
а можно и тупо слеши вырезать
(Добавление)
или проверить на разрешенные символы...это побезопаснее
(Добавление)
еще вариант выбрать в массив имена из папки по маске glob
и проверить на вхождение имени в массив in_array
5. Dragon_Knight - 28 Июня, 2013 - 20:24:42 - перейти к сообщению
Я тоже думаю просто прогонять имя файла через регулярку, типа "/^[a-zA-Z0-9\-_().]+$/", но может есть вариант более оригинальный..
6. LIME - 28 Июня, 2013 - 20:26:18 - перейти к сообщению
но если их там может быть очень много то лучше заранее продумать о сортировке по подпапкам
по авторам/жанрам/первой букве имени
7. Dragon_Knight - 28 Июня, 2013 - 20:35:01 - перейти к сообщению
Файлов будет максимум 50-100..

Вывод файлов происходит через scandir, может стоит использовать этот-же массив и для проверки наличия файла и + регулярка для отрезания подозрительных файлов в самом начале?
8. LIME - 28 Июня, 2013 - 20:41:38 - перейти к сообщению
а нафига тебе регулярка если уже есть список файлов
glob может оказаться удачнее если надо выбрать по расширению...тут уж сам смотри
9. Ch_chov - 28 Июня, 2013 - 21:15:07 - перейти к сообщению
Теоретически достаточно вырезать первый слэш и все сдвоенные точки из имени файла.

Если это CMS или фреймворк то можно просто сделать какой нибудь вирутальный путь (например: files/protected) и контроллер, который будет принимать все запросы к этой директории и отдавать файлы на скачивание. Тогда проблема с безопасностью решится сама собой, потому что запросы вне files/protected к данному контроллеру даже не попадаут.
10. esterio - 29 Июня, 2013 - 00:28:51 - перейти к сообщению
ну МБ basename еще в помощь
11. DelphinPRO - 29 Июня, 2013 - 08:24:07 - перейти к сообщению
Ch_chov пишет:
Теоретически достаточно вырезать первый слэш и все сдвоенные точки из имени файла.
очевидное, простое, и надежное решение.

str_replace('.', '', )
и
file_exists
больше ничего не надо
12. esterio - 29 Июня, 2013 - 10:38:29 - перейти к сообщению
DelphinPRO
А разширения?
13. LIME - 29 Июня, 2013 - 12:20:19 - перейти к сообщению
а символ с кодом #0 ?
(Добавление)
хотяяя...хз как это тут использовать
14. DeepVarvar - 29 Июня, 2013 - 14:26:49 - перейти к сообщению
Винда не понимаэ двоеточия в именах файлов. Ch_chov уже указал на них, esterio подтвердит, я напоминаю Закатив глазки
15. shum0531 - 24 Августа, 2013 - 08:35:11 - перейти к сообщению
У меня была такая проблема.
Я ее решил так:
Создаешь базу, в ней хранишь ID и путь файла (Можно еще имя .....)
download.php?file=526
Скрипт находит в базе ID = 526 и получает путь.
А если не нашел то посылает куда по дальше Улыбка

 

Powered by ExBB FM 1.0 RC1