Pull to refresh

Ограничения в secure_link «реальном» мире

Reading time 3 min
Views 3K
Здравствуйте.
Побудила меня написать эту заметку статься Недокументированные возможности secure_link.
Где по большому счету была теория но мало прикладных примеров.
Поэтому я и решил немножко исправить ситуацию и поделится своими небольшими наработками.

Итак исходные данные.

  • Выделенный сервер где хранятся видеоресурсы
  • Сайт на ucoz.ru.

Дополнительные ограничения: ucoz.ru – только HTML+ JavaScript. Никаких php, perl, python и т.д. и т.п.
В данный момент uppod-плеер на ucoz-е содержит прямые ссылки на видео с выделенного сервера. И соответственно любой мало-мальски подкованный пользователь может без проблем скачать любой из понравившихся фильмов без проблем.

Задание:

  1. Обезопасить материал на выделенном сервере, дав возможность только смотреть в онлайне.

Первым делом, порывшись в интернете, обнаружил модуль secure_link который и был поставлен в пробном варианте и работал превосходно. Но после того как заказчик пожелал чтоб видеофайлы можно было перемотать я столкнулся с небольшой проблемой. А конкретно с тем, что для перемотки используются HTTP GET метод с параметром, а secure_link по молчанию считает хэш для всей строки которая находится после указанного location-а.
Таким образом:
  • /prefix/hash/video.flv и
  • /prefix/hash/video.flv?start=123321234

– имеют разный hash.
После нескольких минут гугления было решено отказаться от secure_link и организовать хэш своими силами (т.е. силами других модулей nginx)

Для этого были скачаны ngx_devel_kit[1] и ngx_http_set_hash[2] и собраны.
Потом был настроен определенным образом location:
location ~ /secure/(.*)/(X-FACTOR-EYYRBBFHR64534)/(.*) {
flv;
set $secret_value "JOP3zneXLjM";
set $hash_value $1;
set_md5 $secret_hash $2$secret_value;
set $value $3;
if ($hash_value != $secret_hash) { rewrite ^ /error.html break; }
rewrite ^ /X-FACTOR-EYYRBBFHR64534/$value?$args break;
}
location /X-FACTOR-EYYRBBFHR64534 { flv; internal; }

После этих манипуляций немного изменился формат URL-а ибо теперь хэшиуется не файл а директория а аргументы файла передаются нормально и соответственно работает перемотка. Да, теоретически, это упущение ибо зная хэш директории можно скачать все файлы которые в ней находятся но за 2 года работы прецедентов не было + немного пораскинув мозгами мы поставили в крон программку которая динамически меняет $secret_value каждые N минут. Что в принципе уже устраивало заказчика.

Формирование плэйлистов

Поскольку в uppod в качестве параметров передается плэйлист то надо было позаботится о его динамическом формировании в соответствии с хэшами. Напоминаю что у нас есть возможность на сайте пользоваться только html + javascript. После недолгих консультаций с заказчиком было выработано следующее решение:
PHP скрипт вызывается со стороны выделенного сервера который формирует уже готовый объект плеера и в iframe-e отобраэжает его. На сайте внедряется Javascipt со следующим содержанием:
function loadPlayer(p) {var D = new Date(); var T = D.getTime();document.write("");}

И вызывается простым loadPlayer(«X-FACTOR-EYYRBBFHR64534»);
Main.php выглядит следующим (неоптимальным но работающим) образом:

<?php
header("Pragma: no-cache");
header("Cache-Control: no-cache,must-revalidate");

require "secret.php";

$value = "st=http://SITE/uppod/video7-1005.txt&pl=";
$value = $value . "http://HOST/secure/playlists/";

if(preg_match("/SITE/i",$_SERVER["HTTP_REFERER"]))
{ $value = $value . md5($_GET["playlist"].".txt".$secret); }
$value = $value . "/".$_GET["playlist"].".txt&poster=";
?>
<object id="videoplayer113031" type="application/x-shockwave-flash" data=http://SITE/uppod/uppod.swf width="500" height="650">
<param name="allowFullScreen" value="true" />
<param name="allowScriptAccess" value="always" />
<param name="wmode" value="transparent" />
<param name="movie" value="http://SITE/uppod/uppod.swf" />
<param name="flashvars" value="<?php echo $value; ?>" />
</object>


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

P.S.
1. ngx_devel_kit: github.com/simpl/ngx_devel_kit
2. ngx_http_set_hash: github.com/simpl/ngx_http_set_hash
Tags:
Hubs:
+4
Comments 5
Comments Comments 5

Articles