Форум / Рецепты / Защита ссылок с привязкой по IP (php, apache)
Почитал на этом форуме статьи по привязки к IP. Решил написать более простенькую реализацию, которая используется у нас в биллинге проверку по ключу и с другими данными, к хэшу (либо другой ваш алгаритм шифрования) можно добавить любые ваши данные, которые вам захочется.
Данная реализация будет полезна тем, у кого в БД хранятся ссылки.


На странице с видео генерируем хэш.



Ваш запроос в БД к id видео... url, название и т.п.
$videoID = mysql_fetch_assoc(mysql_query("SELECT * FROM 'ваша_таблица' WHERE 'id' = 'ID_видео' ORDER BY 'id';"),0);
$hash = md5($_SERVER['REMOTE_ADDR'].'ваш_ключ');



<object data="http://site.ru/uppod/uppod.swf" type="application/x-shockwave-flash" width="300" height="240">
<param name="bgcolor" value="#000000" />
<param name="allowFullScreen" value="true" />
<param name="allowScriptAccess" value="always" />
<param name="movie" value="http://site.ru/uppod/uppod.swf" />
<param name="wmode" value="opaque" />
<param name="flashvars" value="st=http://site.ru/uppod/skin.txt&auto=play&comment=<?=$videoID['name'];?>&file=http://site.ru/stream.php?id=<?=$videoID['id'];?>&hash=<?=$hash;?>" />
</object>


Файл stream.php


$hash = $_GET['hash'];
$id = (int) abs($_GET['id']);
$mykey = md5($_SERVER['REMOTE_ADDR'].'ваш_ключ');

$videoID = mysql_fetch_assoc(mysql_query("SELECT * FROM 'ваша_таблица' WHERE 'id' = '".$id."' ORDER BY 'id';"),0);

if ($hash == $mykey)
{ // Проверка пройдена, хэш верный.
header('X-SendFile: ' . realpath($videoID['url']));
header("Content-type: application/octet-stream");
header('Content-type: video/mp4');
header("Content-disposition: attachment; filename=".$videoID['url']);
readfile($videoID['url']);


}

else
{ // Проверка не пройдена, отдаем видеофайл рекламы.
$nohash = 'http://site.ru/playlist/reklama.mp4';
header("Content-type: application/octet-stream");
header('Content-type: video/mp4');
header("Content-disposition: attachment; filename=".$nohash);
readfile($nohash);


}



Собсвтенно и всё :) Можно еще реврайты добавить, чтобы ссылка выглядела без php файла. Если будут какие-то дополнения — пишите. Написал "на коленке" данную реализацию. В заголовках не силен, если что поправьте меня.


UPD 27 октября 2015: Нашел лучшее решение — это Nimble Stream Server. Как для мобил m3u8 так и для компов. Сам Nimble бесплатен, но панель платная — от $20/месяц. Не нужно ничего ковырять в NGINX, APACHE. Все делается в панели, указываем полный путь к папке с видео, вставляем ссылку на страницу, где php генерирует ключ для каждого IP. Свой файл заглушки не хотят давать возможность вставлять.
Подробнее:
Nimble — ссылка
Защита — ссылка

UPD 09 декабря 2015: В Nimble (и не только) нашел неприятную вещь, кто использует защиту. Сейчас многие браузеры используют прокси для сжатия трафика. Это сказывается на доступности файла/потока, когда ключ генерируется под IP прокси, а при отдачи файла уже открывается, например, в MX Player (либо ссылку вставляют в другой плеер) — выдаст пользователю ошибку 403.

Кому нужно решение — обращайтесь. Функция на PHP. Определяет в ~97% случаях реальный IP за прокси пользователя UCWeb, Opera, Ovi, Dolphin, Chrome и другие браузеры, которые используют прокси для сжатия трафика.
PHPSIDСсылка на пост (Смотрели 29470)14.03.15 05:00     Ответить
Ваше имя*
 E-mail* (не публикуется)
 
 
Если пишете о проблеме, то приложите, пожалуйста, ссылку на свой плеер отсюда — Плеер: Файл > Код > Ссылка
Вставка кода — [code][/code] дублировать ответы на e-mail
1
kz-video 07.04.15 - 16:10
Не оптимально для больших кино сайтов) нагрузка большая будет
2
PHPSID 09.04.15 - 14:11
Если хранить все на одном сервере, то разумеется.
3
kz-video 16.04.15 - 21:38
1 неплохой сервер может до 200 онлайн выдержать) я думаю через nginx будет проще, а так неплохой вариант
4
PHPSID 17.04.15 - 12:22
Смотря что за сервер. Когда я занимался онлайн фильмами, самый дешевый VDS держал онлайн 100–150. RAM 512 :) для теста брал. Все в трафик уперается и в канал, а не конфиг его.
5
PHPSID 27.10.15 - 11:23
Нашел лучшее решение — это Nimble Stream Server. Как для мобил m3u8 так и для компов. Сам Nimble бесплатен, но панель платная — от $20/месяц.
6
PHPSID 27.10.15 - 11:23
Nimble — https://ru.wmspanel.com/nimble
7
RIMUS1989i 12.01.16 - 22:48
Ребята подскажите, как защитить hls средствами php, nginx? Транслирует wowza 2.2.
8
PHPSID 12.01.16 - 22:50
Средствами php — никак. По крайне мере я не знаю такого. В Wowza ведь есть защита вроде как.
9
RIMUS1989i 12.01.16 - 23:25
Есть но с 3.6 версии, а у меня 2.2.4. денег нет пока купить последнюю 4 версию (1995 Евро). Вот поэтому и ищу какой нибудь вариант хотя бы временно защитить.
10
PHPSID 12.01.16 - 23:27
HLS с чего идет? Есть один вариантик… Смотря с чего идет.
11
PHPSID 12.01.16 - 23:36
А хотя… Если сервер позволяет, ставьте Нимбл и через него ретранслируйте с защитой.
12
RIMUS1989i 13.01.16 - 00:27
ip-camera->wowza-->hls , не охота вешать еще одно ПО на сервер. Хотя надо почитать о нем. А что за вариантик?
13
PHPSID 13.01.16 - 00:30
Удалить Wowza и поставить Нимбл. Wowza особо не юзал, но для таких целей, чтобы вещать с камеры и Нимбл подойдет. Бесплатный сам по себе, а панель от 25$ и то без панели можно обойтись. Имхо!
14
RIMUS1989i 13.01.16 - 03:19
Спасибо! Установил нимбл, все работает, единственное интересует что за id в настройках?

"streams":[
{
"id":"56955977df224f4c58000081_1452628885911",
"app":"live",
"stream":"s1.stream",
"urls":[
"rtsp://0.0.0.0/h264"
],
"protocol":"RTSP",
"duration":6,
"transmux":[

],
"RtspSettings":{
"mode":"TCP_UDP"
}
},


И еще вы писали про прокси, как это лечится?
15
PHPSID 13.01.16 - 06:30
Это для панели Нимбла скорей всего. Я не знаю и документации, естественно нет и не будет так как у них бизнес основан на панели, что все через нее делается.

Насчет прокси — 10$. Функция на PHP, ее нужно будет вместо $_SERVER["REMOTE_ADDR"] использовать.
Если нужно, оставьте контакт.
16
RIMUS1989i 13.01.16 - 21:34
xxx.rim(собачка)майл.ру
17
PHPSID 14.01.16 - 01:39
Отправил.
18
victorsmail 19.02.16 - 12:51
использовал что-то подобное раньше, но при больших нагрузках выдавать файлы через функцию php "readfile" это зло.
сча использую ещё более простой подход через "curl_init":

new Uppod({… ,file:"getfile.php?target="+song_id, …});

файл getfile.php:

достаю из базы ссылку на файл $file

header(’Content-Description: File Transfer’);
header(’Content-Type: application/octet-stream’);
header(’Content-Disposition: attachment; filename=’ . str_replace(",","",basename($file)));
header(’Content-Transfer-Encoding: binary’);
header(’Expires: 0’);
header(’Cache-Control: must-revalidate’);
header(’Pragma: public’);
header(’Content-Length: ’ . $_SESSION[’filesize’]);

if (function_exists(’curl_init’)) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $file);
curl_exec($ch);
curl_close($ch);
}

и нагрузки нет (вроде), и реальной ссылки не видно.
19
PHPSID 20.02.16 - 07:29
Куда ж она денется , нагрузка. дело ваше как и где использовать, это как временный вариант так то, если защиту ставить , но ни как не эту при хорошей посешаимости.
20
Berlli 02.08.16 - 23:01
Будет ли работать данный тип защиты на моем провайдере ссылка, подскажите ка?
Сообщить об ошибке на сайте
 Uppod © 2008–2020
Сообщить об ошибке на сайте
Если ошибка относится к плееру, а не сайту, либо Вы хотите получить ответ на вопрос —
лучше написать на форуме