Как защитить паролем потоковое видео с помощью php - PullRequest
7 голосов
/ 13 ноября 2008

Какой лучший способ защитить паролем быстрое потоковое видео, используя php / .htaccess. Они передаются с использованием rtsp, но я могу использовать другие форматы, если это необходимо.

Я знаю, как выполнить аутентификацию с помощью php, но я не уверен, как настроить аутентификацию, чтобы защитить URL потоковых файлов, чтобы пользователь не мог просто скопировать URL и поделиться им.

Или я обдумываю это, и я могу просто использовать обычную схему аутентификации и поместить файлы в защищенный каталог?

Ответы [ 4 ]

4 голосов
/ 13 ноября 2008

Веб-серверы nginx и lighttpd имеют заголовки X-Send-File, которые вы можете вернуть из PHP. Таким образом, вы можете выполнить свои проверки в PHP, а затем условно серверный файл.

if (check_user_can_access()){
    header('X-sendfile: /path/to/file');
} else {
    header('HTTP/1.1 403 Fail!');
}

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

Nginx и, возможно, lighttpd позволяют ограничить скорость загрузки, поэтому вы не отправляете потоковые данные быстрее, чем они могут быть использованы.

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

1 голос
/ 13 ноября 2008

Возможно, вы захотите взглянуть на: mod_xsendfile (для apache)

Позволяет внутренне перенаправить в файл.

Чтобы вы могли указать ссылку для скачивания на checkCredentials.php

<?php
if ( isAuthorised($_POST['user'], $_POST['pass']) ) {
    header("X-Sendfile: $somefile");
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; file=\"$somefile\"");
    exit(0);
} else {
    show403('bad credentials');
}
?>

Этот модуль также доступен для других веб-серверов. Если я правильно помню, идея изначально пришла от lighttpd, но - как утверждает Джош - также доступна для nginx.

1 голос
/ 13 ноября 2008

Попробуйте использовать сервис Amazon S3, у него есть свои причуды, но это имеет смысл, как только вы ознакомитесь с ним.

В их API есть хуки для достижения временных URL-адресов, которые активны в течение указанного времени, поэтому вы можете свободно показывать URL-адрес посетителю, потому что он не будет работать через 10 минут или около того.

Это почти тривиальная вещь с php (около 15 строк кода), на их форумах есть множество примеров, так что вам не нужно идти с нуля и читать полную документацию о том, как этого добиться.

Какую авторизацию вы будете делать перед тем, как создавать и показывать ссылки, решать только вам.

Вы также можете сделать так, чтобы он обслуживался с вашего домена, например video.yourdomain.com, вместо стандартных URL-адресов s3.

И последнее, это дешево - мы заплатили около 2 долларов США за месяц тестирования и развертывания, когда я загрузил 8 ГБ, загрузил его полностью 3 раза и инициализировал загрузку около 100 раз. Человек, для которого я делал это, настолько доволен ценой, что хочет переместить все свои загружаемые носители на s3.

Теперь, перечитывая все, что я написал, это выглядит как реклама / спам, но я так доволен обслуживанием, потому что раньше я закодировал все для аудиофайлов, и потребовались дни, пока все работало просто отлично, и это заняло пару часов для реализации (в основном знакомство с сервисом).

0 голосов
/ 13 ноября 2008

Прежде всего, очень легко подделать реферера. Эта информация хранится в браузере пользователя, поэтому пользователь может просто подключиться к вашему серверу через telnet и предоставить свой собственный реферер, соответствующий вашему домену.

Пара вещей, которые вы можете попробовать:

Во-первых, более безопасно, но все еще подделано. mod_rewrite предоставляет возможность проверять куки. Что вы могли бы сделать, это установить cookie, когда пользователь посещает ваш сайт, который содержит некоторые неясные данные. Затем вы можете изменить свой RerwriteCond на что-то вроде этого:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_COOKIE} obscurename=obscurevalue [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain.com/.*$ [NC]
RewriteRule \.(asx¦ASX)$ http://www.yourdomain.com/images/leech.gif [R,L]

Другой, лучший метод - работа с PHP и mime-типами. Я не уверен, в какой степени это будет поддерживать потоковый контент, но я предполагаю, что это будет работать. Что вы можете сделать, так это чтобы все ваши ссылки на видео указывали на файл .php (строка запроса будет определять, какое видео было выбрано). Затем, когда пользователь пытается перейти по этой ссылке, вы делаете что-то вроде этого:

<?php
    // You could also check some sort of session variable
    // that is set when the user visits another part of your
    // site
    if(!isLoggedIn()){
       header("Location: errorPage.htm");
       exit;
    }else{
       // Get the name of the file specified
       $file = get_file_name($_GET['fileID']);

       // Specify the proper mime-type for the data you're sending
       // (this may have to change, depending on your situation)
       header("Content-type: video/vnd.rn-realvideo");

       // Read the file and output it to the browser
       readfile($file);
    }
?>

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

...