2015-05-17 3 views
3

Фоновая информация:Предотвращение прямого доступа к файлам

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

Проблема:

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

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

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

+0

Проверьте, не создан ли сеанс .. Если нет, не давайте доступ..simplest делать. – Lal

+0

Почему бы не попытаться реализовать идентификатор сеанса при входе в систему? Система может проверить этот идентификатор, а если нет, то URL вернет 403. –

+0

Возможно, вы ищете горячую ссылку http://www.hongkiat.com/blog/smarter-way-to-prevent-image- hotlinking-with-htaccess/ –

ответ

0

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

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

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

+0

Да, я вижу, что это опубликовано на нескольких других сообщениях SO, к сожалению, это для клиента, хостинг-провайдер которого разрешает доступ к корневой веб-папке. Таким образом, файлы должны размещаться на этом уровне. – dw1991

+1

@ dw1991 Если это сервер linux, добавьте файл .htaccess в папку images/videos, содержащую только 'deny from all'. Это будет запрещать любой доступ через веб-сервер, но php сможет читать файлы просто отлично. И если ваш клиент действительно хочет показывать видео и изображения через услугу подписки, они могут захотеть получить достойный пакет хостинга ;-) – jeroen

+0

Примечание: виджеты Javascript также требуют доступа к файлам в виде URL-адреса – dw1991

3

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

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

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

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

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

Пример сценария может быть что-то вроде:

$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», что также может помочь.

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

+0

Как бы я мог различать пользователя, просматривающего видео через веб-сайт (например, видеопроигрыватель javascript) и видео через прямой URL-адрес? Я предполагаю, что я имею в виду, что пользователь с правильными учетными данными должен иметь доступ к видео (как в режиме просмотра) через JS-видеоплеер, но не напрямую, через URL-адрес. – dw1991

+2

Я не думаю, что это возможно концептуально. Загрузка файла - именно то, что должен сделать JS-видеоплеер для показа содержимого. Вы можете попробовать несколько трюков, чтобы отличить запросы, сделанные браузером, чтобы сделать прямую загрузку с тех, что делает ваш JS-плеер, но в конце концов это не остановит того, кто действительно хочет его загрузить. – SkyWriter