← Форум / Рецепты / Защита ссылок с привязкой по 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'].'ваш_ключ');
Собсвтенно и всё :) Можно еще реврайты добавить, чтобы ссылка выглядела без 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 и другие браузеры, которые используют прокси для сжатия трафика.
Смотря что за сервер. Когда я занимался онлайн фильмами, самый дешевый VDS держал онлайн 100150. RAM 512 :) для теста брал. Все в трафик уперается и в канал, а не конфиг его.
Есть но с 3.6 версии, а у меня 2.2.4. денег нет пока купить последнюю 4 версию (1995 Евро). Вот поэтому и ищу какой нибудь вариант хотя бы временно защитить.
Удалить Wowza и поставить Нимбл. Wowza особо не юзал, но для таких целей, чтобы вещать с камеры и Нимбл подойдет. Бесплатный сам по себе, а панель от 25$ и то без панели можно обойтись. Имхо!
Это для панели Нимбла скорей всего. Я не знаю и документации, естественно нет и не будет так как у них бизнес основан на панели, что все через нее делается.
Насчет прокси 10$. Функция на PHP, ее нужно будет вместо $_SERVER["REMOTE_ADDR"] использовать.
Если нужно, оставьте контакт.
использовал что-то подобное раньше, но при больших нагрузках выдавать файлы через функцию php "readfile" это зло.
сча использую ещё более простой подход через "curl_init":
new Uppod({… ,file:"getfile.php?target="+song_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"
}
},
И еще вы писали про прокси, как это лечится?
Насчет прокси 10$. Функция на PHP, ее нужно будет вместо $_SERVER["REMOTE_ADDR"] использовать.
Если нужно, оставьте контакт.
сча использую ещё более простой подход через "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);
}
и нагрузки нет (вроде), и реальной ссылки не видно.