Антилич скрипт(скрытие прямых ссылок на файлы) и большие файлы

Тема в разделе "PHP Pro", создана пользователем G-Null, 2 апр 2010.

Статус темы:
Закрыта.
  1. G-Null

    G-Null

    Регистр.:
    6 сен 2007
    Сообщения:
    180
    Симпатии:
    21
    Есть простой скрипт благодаря которому можно отдавать файлы(не паля прямые линки на файлы) и осуществлять докачку файла(в случае дисконекта, например:(
    PHP:
    $fname=$_GET['fname']; // имя файла

    $fsize filesize('secret_data/'.$fname); // secret_data папка в которой лежат файлы
    $fdown 'secret_data/'.$fname;

    // Установлена или нет переменная HTTP_RANGE
    if (getenv('HTTP_RANGE') == "") {
      
    // Читать и отдавать файл от самого начала
      
    $f fopen($fdown'r');

      
    header("HTTP/1.1 200 OK");
      
    header("Connection: close");
      
    header("Content-Type: application/octet-stream");
      
    header("Accept-Ranges: bytes");
      
    header("Content-Disposition: Attachment; filename=".$fname);
      
    header("Content-Length: ".$fsize); 


      echo 
    fread($f$fsize);

      }
      
    fclose($f);
    }
    else {
      
    // Получить значение переменной HTTP_RANGE
      
    preg_match ("/bytes=(\d+)-/"getenv('HTTP_RANGE'), $m);
      
    $csize $fsize $m[1];  // Размер фрагмента
      
    $p1 $fsize $csize;    // Позиция, с которой начинать чтение файла
      
    $p2 $fsize 1;         // Конец фрагмента

      
    $f fopen($fdown'r');

      
    header("HTTP/1.1 206 Partial Content");
      
    header("Connection: close");
      
    header("Content-Type: application/octet-stream");
      
    header("Accept-Ranges: bytes");
      
    header("Content-Disposition: Attachment; filename=".$fname);
      
    header("Content-Range: bytes ".$p1."-".$p2."/".$fsize);
      
    header("Content-Length: ".$csize);

      
    fseek ($f$p1);
      echo 
    fread($f$csize);

      
    fclose($f);
    Будет ли нормально работать такой метод для файлов размером по 1-2 гигибайта
     
  2. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
  3. yalama

    yalama Создатель

    Регистр.:
    25 янв 2009
    Сообщения:
    45
    Симпатии:
    2
    А для какого веса работает этот код и где его нужно прописать?)
     
  4. 1d37r

    1d37r Читатель

    Заблокирован
    Регистр.:
    16 сен 2007
    Сообщения:
    287
    Симпатии:
    48
    host/script.php?fname=../../../../../../../etc/passwd
    :bad:
     
  5. axaaxa

    axaaxa Постоялец

    Регистр.:
    28 янв 2009
    Сообщения:
    66
    Симпатии:
    3
    Поставь nginx, там есть модуль для сокрытия адреса файла. Кстати для передачи больших файлов этот сервер само то.
     
  6. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    Отдавать файл через php - конечно рак мозга, но зачастую это оказывается единственный выход. О чем надо помнить:

    set_time_limit() - не 0, а какое-нибудь большое число, например сутки. Если у тебя за сутки не стянули файл - нафиг таких диалапщиков.

    fread() - надо читать не весь файл, а кусками, как в примере у admLoki. Иначе на больших файлах будет вылетать с Memory allocation error.

    не забывать делать flush() после каждого отданного кусочка. А то тоже вылетает. connection_status() и connection_aborted() тут в принципе до жопы, можно без них.

    ну и еще, на чем я лично спотыкался, это правильно высчитывать Filesize, Filepos и HTTP-Range. Одно от нуля считается, второе от единицы, короче легко запутаться. Но ты, если будешь готовый код копировать, наверное тут не заметишь проблем. )

    Ну и напоследок - всегда можно обойтись самим апачем (если уж нет прав поставить nginx), просто дописывая ему в RewriteMap какой-нибудь уникальный урл для каждого файла, и раз в сутки чистя старые урлы, чтобы ссылки не становились перманентными. Плюс mod_rewrite позволяет ограничить доступ к этому урлу по ip и по куке - т.е. ты можешь выдавать юзеру сгенеренную ссылку, которая действует только для него и еще и ограничена по времени. Этот вариант намного лучше, т.к раздачей занимается сам апач (лучше бы nginx конечно, но раз нету..), но есть и минус - нельзя ограничивать скорость скачки.
     
  7. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    скажем а как работает депозит или лилбит ?
    докачка хорошо бы но можно и без нее.
     
  8. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    737
    Симпатии:
    263
    Все нормальные сайты юзают nginx или самописные балансировщики. Написать самому на сях веб-сервер чтоб отдавал статику - не так уж и сложно, а выиграть на этом можно каких-нибудь 200-300 дополнительных соединений по сравнению с nginx, так что когда масштабы соответствующие, то есть смысл и сэкономить.

    "Отдавалка через php-скрипт", при условии что php запущен как модуль апача, вряд ли потянет больше 600 параллельных скачиваний на стандартном серваке. Если как cgi - и того меньше.
     
    XSiteCMS нравится это.
  9. CNiks0N

    CNiks0N lamp.root

    Регистр.:
    28 ноя 2008
    Сообщения:
    230
    Симпатии:
    48
    ещё есть варианты:
    1. копировать файл :)
    2. создавать линк на файл (ln)
     
Статус темы:
Закрыта.