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. xhugo - 29 Июня, 2011 - 15:41:16 - перейти к сообщению
Допустим залит файл site/upload/test.rar
если перейти по тому адресу то скачаем мы его.
а нужно чтоб скачивание происходило только через свой скрипт(через него например).
это нужно для того чтобы избежать всякого скачивание, я например хочу сделать капчу чтобы скачать, а другой возьмет тупо перейдет по адресу site/upload/test.rar и скачает его, как это избежать?
2. OrmaJever - 29 Июня, 2011 - 15:43:50 - перейти к сообщению
readfile() и там ещё некоторые заголовки
4. xhugo - 29 Июня, 2011 - 15:53:15 - перейти к сообщению
ок. но как же избежать обычного скачивание потом? если например скачаем мы через скрипт, то узнаем настоящий адрес до файла
5. Coder1994 - 29 Июня, 2011 - 15:58:27 - перейти к сообщению
xhugo пишет:
ок. но как же избежать обычного скачивание потом? если например скачаем мы через скрипт, то узнаем настоящий адрес до файла

PHP:
скопировать код в буфер обмена
  1. <?
  2. $fname = 'имя файла';
  3. $fsize=filesize('путь до файла/'.$fname);
  4. $fdown='secret/'.$fname;
  5.  
  6. // Установлена или нет переменная HTTP_RANGE
  7. if (getenv('HTTP_RANGE')=="") {
  8.   // Читать и отдавать файл от самого начала
  9.   $f=fopen($fdown, 'r');
  10.  
  11.   header("HTTP/1.1 200 OK");
  12.   header("Connection: close");
  13.   header("Content-Type: application/octet-stream");
  14.   header("Accept-Ranges: bytes");
  15.   header("Content-Disposition: Attachment; filename=".$fname);
  16.   header("Content-Length: ".$fsize);
  17.  
  18.   while (!feof($f)) {
  19.     if (connection_aborted()) {
  20.       fclose($f);
  21.       break;
  22.     }
  23.     echo fread($f, 500000); // Скорость отдачи в байтах, это примерно 500кб\с
  24.     sleep(1);
  25.   }
  26.   fclose($f);
  27. }
  28. else {
  29.   // Получить значение переменной HTTP_RANGE
  30.   preg_match ("/bytes=(\d+)-/", getenv('HTTP_RANGE'), $m);
  31.   $csize=$fsize-$m[1];  // Размер фрагмента
  32.   $p1=$fsize-$csize;    // Позиция, с которой начинать чтение файла
  33.   $p2=$fsize-1;         // Конец фрагмента
  34.  
  35.   $f=fopen($fdown, 'r');
  36.  
  37.   header("HTTP/1.1 206 Partial Content");
  38.   header("Connection: close");
  39.   header("Content-Type: application/octet-stream");
  40.   header("Accept-Ranges: bytes");
  41.   header("Content-Disposition: Attachment; filename=".$fname);
  42.   header("Content-Range: bytes ".$p1."-".$p2."/".$fsize);
  43.   header("Content-Length: ".$csize);
  44.  
  45.   fseek ($f, $p1);
  46.   while (!feof($f)) {
  47.     if (connection_aborted()) {
  48.       fclose($f);
  49.       break;
  50.     }
  51.     echo fread($f, 500000);
  52.     sleep(1);
  53.   }
  54.   fclose($f);
  55. }
  56. ?>
6. OrmaJever - 29 Июня, 2011 - 16:08:46 - перейти к сообщению
xhugo пишет:
ок. но как же избежать обычного скачивание потом? если например скачаем мы через скрипт, то узнаем настоящий адрес до файла

через .htaccess разрешить доступ к папке с файлами только с 127.0.0.1 (это сам скрипт) а всем остальным 403
7. DeepVarvar - 29 Июня, 2011 - 17:26:15 - перейти к сообщению
OrmaJever пишет:
только с 127.0.0.1 (это сам скрипт)
не совсем.
Можно (даже нужно) запретить вообще всем.
Скрипт не пострадает, отдавать будет.
Директивы .htaccess действуют только для запросов "извне", а "внутренние" обращения к файлам работают непосредственно с файловой системой и ограничиваются через chmod и chown..
8. xhugo - 29 Июня, 2011 - 17:35:33 - перейти к сообщению
Спасибо.
еще вопрос, как лучше хранить файлы, для каждого папку с рандомным именем создавать? чтобы не путать с одинаковых именем файлы или как лучше?
9. OrmaJever - 29 Июня, 2011 - 17:51:03 - перейти к сообщению
Ну смотря какие файлы (насколько они разные), если только масивы то создать паппку а в неё ложить файлы со случайными именами, если файлы както можно сгрупировать то по папкам Улыбка
(Добавление)
В итоге всеровно должна быть одна папка (например files) и в ней все эти папки с категориями и файлы.
В files положить .htaccess

и всё
10. DeepVarvar - 29 Июня, 2011 - 19:41:29 - перейти к сообщению
Файлы можно хранить в папке с их реальными именами.
А отдавать их подставляя каждый раз рандомные имена, главное чтобы расширение у файлов оставалось "родным".
Браузеру без разницы какое имя файла вы ему предоставите в заголовке,
чтобы он принимаемый файл назвал этим именем в файловой системе пользователя.
(Добавление)
Как подводный камень - не будет поддержки догрузки файлов.
Т.к. каждая новая инициализация скрипта-загрузчика будет обзывать файл новым именем.
11. xhugo - 30 Июня, 2011 - 10:00:45 - перейти к сообщению
если использовать .htacces для закрытия,то значит не нужно уже защищать скрипт от инклуда? все равно получается не будет работать?
12. DeepVarvar - 30 Июня, 2011 - 12:24:49 - перейти к сообщению
xhugo пишет:
все равно получается не будет работать?
да,
Но если сервер не апач (или подобный), а nginx (в нем только chmod и chown, или рулить конфиг),
стоит на всякий случай для совместимости сделать и защиту по инклуду.

 

Powered by ExBB FM 1.0 RC1