Запретить прямой доступ к файлам по URL

Справочная информация:

Я работаю над сайтом, который будет предоставлять изображения и видео через подписку. То есть пользователи должны иметь ТОЛЬКО доступ к изображениям и видеоконтенту, если они успешно вошли в систему. (Примечание: система входа в систему использует комбинацию MySQL DB — для хранения имени пользователя и пароля — и php для создания новых пользовательских сессий / аутентификации и т. Д.)

Эта проблема:

Как я могу запретить пользователю (вошел или нет) прямой доступ к файлам изображений и видео? Например, пользователь, который не вошел в систему, может получить прямой доступ к файлу следующим образом: www.domain.com/testvideo.mp4 — при этом в браузере будет отображаться видеоконтент для просмотра или обмена с другими. (ПРИМЕЧАНИЕ: мне все еще нужно иметь возможность использовать / отображать изображения и видеофайлы на месте через HTML, CSS, PHP и т. Д.)

Я пробовал несколько решений .htaccess (в том числе: RewriteCond / RewriteRule & .htpassword), которые успешно предотвратили прямой доступ, НО не позволили использовать файлы на месте через HTML, CSS, PHP и т. д.

Я думал, что это, должно быть, очень распространенная проблема, и если да, то каков наилучший способ ее решения?

3

Решение

Это довольно распространенная проблема с довольно распространенным решением. Для принудительного контроля доступа вы должны вызвать скрипт PHP перед обработкой файла и проверить учетные данные. Затем, если учетные данные действительны, подайте фактический файл.

Вы можете испытать желание подать файл напрямую из скрипта PHP, используя что-то вроде readfile, Это снизит производительность вашего сервера и нарушит возобновление загрузки для клиента.

К счастью, есть решение, когда вы можете передать реальный файл обратно на веб-сервер.

Это работает следующим образом:

  1. Веб-сервер получает запрос на /file.mp4,
  2. В соответствии с установленными вами правилами перезаписи он направляет его в ваш скрипт PHP /serve.php вместо.
  3. Ваш скрипт проверяет учетные данные, например, что-то из сессии или куки.
  4. Если учетные данные действительны, сценарий выдает специально созданный заголовок. Он сообщает веб-серверу, что нужно обслуживать статический файл. Если нет, вы можете также вывести HTTP-код 403.

Пример сценария может быть примерно таким:

$file = '/tmp/file.mp4'; // it is in your best interest to make this file  inaccessible for a direct download
header('X-Sendfile: ' . $file);
header('Content-Type: ' . contentType($file));
header('Content-Disposition: inline;');

Для того чтобы это работало, вам нужно иметь mod_xsendfile (https://tn123.org/mod_xsendfile/) установлен на вашем Apache, что, вероятно, уже имеет место для вашего хостера. Вам также придется добавить несколько строк, чтобы настроить его и настроить правильное переписывание.

Вы можете исправить множество вещей в Google, выполнив «mod_xsendfile php», что также может очень помочь.

Надеюсь, что это имеет смысл!

3

Другие решения

Вы не можете избежать этого, пока ваши файлы общедоступны.

Наиболее распространенный способ — не обслуживать файлы напрямую, а обслуживать их через php, чтобы вы могли проверить доступ пользователей перед тем, как обслуживать файл. И файлы могут находиться в любом месте на сервере, где пользователь веб-сервера (www, apache и т. Д.) Имеет доступ, а посетитель — нет.

Посмотрите примеры в руководстве по PHP readfile а также header чтобы увидеть, как вы можете подать файл через php. Вы также найдете много примеров здесь на SO.

0

По вопросам рекламы [email protected]