PDA

Просмотр полной версии : Запись видео с веб-камеры на сервер (FMS) - Как ограничить максимальный размер?


andreyru
12.12.2007, 19:35
Есть видео-рекордер. Он берёт поток с веб-камеры и отправляет на сервер (FMS). Из клиента поток отправляется посредством:

out_ns.publish("my_recorded_stream", "record");

На серверной части ничего дополнительного не делается (я, собственно, и не знаю можно ли принимать и записывать входящий поток "вручную").

Проблема в следующем. Если некий "хакер" декомпилирует swf-ку моего рекордера и узнает все нужные URI, то он сможет начать непрерывную трансляцию туда видео и рано или поздно место на сервере закончится.

Есть идеи как можно защититься от этого?

grunerasta
12.12.2007, 22:32
Есть - вместе с видео слать что-то еще, например пи деленное на е и умноженное на текущую минуту, ни один хакер с декомпилером не догадается

----

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

andreyru
13.12.2007, 12:57
ни один хакер с декомпилером не догадается
Зачем ему догадываться если у него будет исходный код после декомпиляции? То есть он тупо берёт мой рекордер и убирает в нём ограничения, а потом делает своё грязное дело.
Хочется именно сделать адекватный ограничитель на стороне сервера.

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

Собственно я даже переформулирую вопрос. Вот сейчас на серверной части можно ничего не делать и видео запишется. Оно пишется самим FMS когда с клиента вызвается publish(). Так вот вопрос в том можно ли этот процесс записи взять на себя? На стороне сервера есть класс Stream который вроде как умеет всё что мне нужно, только непонятно в какой момент и где этот поток можно перехватить?

Rzer
13.12.2007, 16:29
Для этого надо подсовывать клиенту swf сгенерированную через php (для этого надо хорошо разбираться в hex-структуре SWF файла) в которой будет к примеру модифицироваться ключ сессии (который содержится в переменной). Php также отдаёт этот ключ и FMS серверу, который при connect ищет этот ключ в списке ключей. Найдя его он разрешает этой swf вещание и тут же удаляет этот ключ из списка. Ключ также удалется из списка например по истечении 10 секунд (времени максимальной загрузки swf у пользователя (он явно не будет использовать модем для вещания))
Такой способ позволяет даже при декомпиляции защититься от сторонних проникновений и гарантирует что swf'ка загружена с твоего сайта. Так как ключи выдаются только при запросах пользователя и имеют очень короткий срок действия "Хакер" не сможет подобрать его для своей Flash'ки

andreyru
13.12.2007, 17:50
На мой взгляд, всякие ключи/шифрования и прочее нужны когда есть необходимость передать данные представляющие некую ценность и есть опасность что их могут утащить.
В моём случае речь идёт об некоторых ограничениях. Ограничения должны соблюдатся в основном на серверной части (в клиенте их можно использовать для удобства - чтобы избежать лишних действий).

Так вот. Проблему я решил. Именно тем способом который пришёл в голову первым и показался не очень оптимальным. Но ничего другого в голову так и не пришло.

На серверная часть приложения при своём запуске делает следующее:

application.onAppStart = function()
{
// Соединяемся с админкой
application.nc = new NetConnection();
application.nc.connect("rtmp://localhost:1111/admin", "root", "pass");
// Запускаем каждую секунду функцию-проверялку
setInterval(checkStreams, 1000);
}
где checkStreams это функция которая проверяет все потоки относящиеся к текущему приложению (для этого требуется коннект к админке).

Вот. Принцип решения я описал. Если кому понадобится исходник этой checkStreams (), то обращайтесь. Ничего сложного там нет, но кода прилично, поэтому и не выкладываю - незачем засорять сообщение =)