Обслуживание больших защищенных файлов в PHP / Apache - PullRequest
5 голосов
/ 06 июля 2010

Мне нужно обслуживать большие файлы (> 2 ГБ) с веб-сервера Apache.Файлы защищены для скачивания, поэтому мне нужен какой-то способ авторизации пользователя.Используемая мной CMS использует файлы cookie, проверенные в базе данных MySQL для проверки пользователя.На сервере у меня нет контроля над max_execution_time и ограничен контроль над memory_limit.

Моя техника работает для небольших файлов.После того, как пользователь был авторизован в PHP (CMS), я использую readfile () для обслуживания файла, который хранится над корнем документа для предотвращения прямого доступа.Я читал о методах разделения загрузки или использования fpassthru, чтобы обойти ограничение памяти PHP.Но я не нашел способа обойти ограничение max_execution_time.

Я думал о хранении файла в корне документа, чтобы мы могли полностью обойти PHP.Но я не могу понять, как ограничить доступ с помощью htaccess.Мне нужно проверить пользователя по базе данных, прежде чем я смогу предоставить ему файл.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 13 июля 2010

Самое приятное на мой взгляд решение: установите mod_xsendfile в свой Apache, сделайте PHP-скрипт авторизующим пользователя, и в случае успеха отправьте ответ с заголовком X-Sendfile, указывающим на местоположение защищенный файл. С этого момента Apache выполняет работу по доставке файла клиенту; не PHP.

1 голос
/ 13 июля 2010

Как насчет использования символических ссылок?Если у вас есть пример папки:

userfacingfiles/
  md5_of_order_id1 --> protected-file.exe
  md5_of_order_id2 --> protected-file.exe

protectedfiles/
  .htaccess (contains deny from all)
  protected-file.exe

Базовый пример:

$salt = 'canttouchthis';

function create_symlink($order_id, $salt, $protected_file) 
{
  $info = pathinfo('protectedfiles/'.$protected_file);

  symlink('protectedfiles/'.$protected_file, 'userfacingfiles/'.md5($order_id.$salt).'.'.$info['extension']);
}


function get_file($order_id, $salt, $extension)
{

  header('Location: userfacingfiles/'.md5($order_id.$salt).'.'.$extension);
  exit();
}

использование:

Когда пользователь платит:

create_symlink(1, 'secureSALT', 'ebook.pdf');

Когда пользователь хочет загрузить свою электронную книгу

get_file(1, 'secureSALT');

Это может быть не самый переносимый метод, но поскольку вы перенаправляете пользователя, веб-серверобработка загрузок.

1 голос
/ 06 июля 2010
...