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

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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Dragon_Knight
Отправлено: 28 Июня, 2013 - 20:14:08
Post Id



Гость


Покинул форум
Сообщений всего: 103
Дата рег-ции: Май 2012  
Откуда: г.Мытищи, МО


Помог: 0 раз(а)




Всем привет.

Есть задача скрыть папку, где находятся все файлы для скачки. Это простая и тривиальная задача.
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 и уаля, сервер отдал нам конфиг файл...

Как сделать защиту от такого?
 
 Top
LIME
Отправлено: 28 Июня, 2013 - 20:17:13
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




а файлы любые? или с определенным расширением?
(Добавление)
в общем случае можно хранить их не под настоящим именем а под его хешем md5
тоесть приходит запрос на file.ext
преобразуешь его в хеш и отдаешь этот файл
 
 Top
Dragon_Knight
Отправлено: 28 Июня, 2013 - 20:19:56
Post Id



Гость


Покинул форум
Сообщений всего: 103
Дата рег-ции: Май 2012  
Откуда: г.Мытищи, МО


Помог: 0 раз(а)




Вообще там будут только MP3 файлы, но не очень хочется делать привязку к разрешению, но если других вариантов нету, то... Радость

ADD: Ситуация такая, что файлы будут попадать в папку через FTP, т.е заноситься в базу или где-то ещё отмечаться не будут.

(Отредактировано автором: 28 Июня, 2013 - 20:21:18)

 
 Top
LIME
Отправлено: 28 Июня, 2013 - 20:20:06
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




а можно и тупо слеши вырезать
(Добавление)
или проверить на разрешенные символы...это побезопаснее
(Добавление)
еще вариант выбрать в массив имена из папки по маске glob
и проверить на вхождение имени в массив in_array
 
 Top
Dragon_Knight
Отправлено: 28 Июня, 2013 - 20:24:42
Post Id



Гость


Покинул форум
Сообщений всего: 103
Дата рег-ции: Май 2012  
Откуда: г.Мытищи, МО


Помог: 0 раз(а)




Я тоже думаю просто прогонять имя файла через регулярку, типа "/^[a-zA-Z0-9\-_().]+$/", но может есть вариант более оригинальный..
 
 Top
LIME
Отправлено: 28 Июня, 2013 - 20:26:18
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




но если их там может быть очень много то лучше заранее продумать о сортировке по подпапкам
по авторам/жанрам/первой букве имени
 
 Top
Dragon_Knight
Отправлено: 28 Июня, 2013 - 20:35:01
Post Id



Гость


Покинул форум
Сообщений всего: 103
Дата рег-ции: Май 2012  
Откуда: г.Мытищи, МО


Помог: 0 раз(а)




Файлов будет максимум 50-100..

Вывод файлов происходит через scandir, может стоит использовать этот-же массив и для проверки наличия файла и + регулярка для отрезания подозрительных файлов в самом начале?
 
 Top
LIME
Отправлено: 28 Июня, 2013 - 20:41:38
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




а нафига тебе регулярка если уже есть список файлов
glob может оказаться удачнее если надо выбрать по расширению...тут уж сам смотри
 
 Top
Ch_chov
Отправлено: 28 Июня, 2013 - 21:15:07
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Теоретически достаточно вырезать первый слэш и все сдвоенные точки из имени файла.

Если это CMS или фреймворк то можно просто сделать какой нибудь вирутальный путь (например: files/protected) и контроллер, который будет принимать все запросы к этой директории и отдавать файлы на скачивание. Тогда проблема с безопасностью решится сама собой, потому что запросы вне files/protected к данному контроллеру даже не попадаут.

(Отредактировано автором: 28 Июня, 2013 - 21:19:09)

 
 Top
esterio
Отправлено: 29 Июня, 2013 - 00:28:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




ну МБ basename еще в помощь
 
 Top
DelphinPRO
Отправлено: 29 Июня, 2013 - 08:24:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Ch_chov пишет:
Теоретически достаточно вырезать первый слэш и все сдвоенные точки из имени файла.
очевидное, простое, и надежное решение.

str_replace('.', '', )
и
file_exists
больше ничего не надо


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
esterio
Отправлено: 29 Июня, 2013 - 10:38:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




DelphinPRO
А разширения?
 
 Top
LIME
Отправлено: 29 Июня, 2013 - 12:20:19
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




а символ с кодом #0 ?
(Добавление)
хотяяя...хз как это тут использовать
 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Июня, 2013 - 14:26:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Винда не понимаэ двоеточия в именах файлов. Ch_chov уже указал на них, esterio подтвердит, я напоминаю Закатив глазки
 
 Top
shum0531
Отправлено: 24 Августа, 2013 - 08:35:11
Post Id



Гость


Покинул форум
Сообщений всего: 92
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




У меня была такая проблема.
Я ее решил так:
Создаешь базу, в ней хранишь ID и путь файла (Можно еще имя .....)
download.php?file=526
Скрипт находит в базе ID = 526 и получает путь.
А если не нашел то посылает куда по дальше Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с файловой системой и файлами »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB