Справочная информация:
Я работаю над сайтом, который будет предоставлять изображения и видео через подписку. То есть пользователи должны иметь ТОЛЬКО доступ к изображениям и видеоконтенту, если они успешно вошли в систему. (Примечание: система входа в систему использует комбинацию MySQL DB — для хранения имени пользователя и пароля — и php для создания новых пользовательских сессий / аутентификации и т. Д.)
Эта проблема:
Как я могу запретить пользователю (вошел или нет) прямой доступ к файлам изображений и видео? Например, пользователь, который не вошел в систему, может получить прямой доступ к файлу следующим образом: www.domain.com/testvideo.mp4 — при этом в браузере будет отображаться видеоконтент для просмотра или обмена с другими. (ПРИМЕЧАНИЕ: мне все еще нужно иметь возможность использовать / отображать изображения и видеофайлы на месте через HTML, CSS, PHP и т. Д.)
Я пробовал несколько решений .htaccess (в том числе: RewriteCond / RewriteRule & .htpassword), которые успешно предотвратили прямой доступ, НО не позволили использовать файлы на месте через HTML, CSS, PHP и т. д.
Я думал, что это, должно быть, очень распространенная проблема, и если да, то каков наилучший способ ее решения?
Это довольно распространенная проблема с довольно распространенным решением. Для принудительного контроля доступа вы должны вызвать скрипт PHP перед обработкой файла и проверить учетные данные. Затем, если учетные данные действительны, подайте фактический файл.
Вы можете испытать желание подать файл напрямую из скрипта PHP, используя что-то вроде readfile
, Это снизит производительность вашего сервера и нарушит возобновление загрузки для клиента.
К счастью, есть решение, когда вы можете передать реальный файл обратно на веб-сервер.
Это работает следующим образом:
/file.mp4
,/serve.php
вместо.Пример сценария может быть примерно таким:
$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», что также может очень помочь.
Надеюсь, что это имеет смысл!
Вы не можете избежать этого, пока ваши файлы общедоступны.
Наиболее распространенный способ — не обслуживать файлы напрямую, а обслуживать их через php, чтобы вы могли проверить доступ пользователей перед тем, как обслуживать файл. И файлы могут находиться в любом месте на сервере, где пользователь веб-сервера (www, apache и т. Д.) Имеет доступ, а посетитель — нет.
Посмотрите примеры в руководстве по PHP readfile
а также header
чтобы увидеть, как вы можете подать файл через php. Вы также найдете много примеров здесь на SO.