Форум / Рецепты / Защита ссылок по IP (без nginx)
Поставил  uppod и естественно решил как и все защитить контент….
Нашел метод — ссылка
Начал его реализовывать. И тут мне стало понятно что метод совсем сырой(20 сек потребовалось его обойти. причина — сама ссылка), да и не всегда реализуем для большинства(nginx для многих потемки).
имеем в начале ссылку на файл
http://flv.site.ru/video/video.flv

получаем на выходе
http://flv.site.ru/video/922f3b5fcb227cfae135299e786edd82/video.flv

Не серьезно если не использовать шифрование ссылок в uppod. Решил сделать ссылку на видео файл вот такой:
http://site.ru/video.php?hash=271ac285a54bccaab18b99949b0ecf62filenameQnV0dHBsdWdzX3RhcG9uX2FuYWxfZGVfU2hvdHNfVG95cy5tcDQ=

За идею взял скрипт php предложенный автором метода и дописал в нем кодирование ссылки.
Видео у нас находится в папке video.
В корень сайта кидаем video.php

<?php
$hash =$_GET['hash'];
$hash=explode('filename',$hash);
$filename = $hash[1];
$filename=base64_decode($filename);//декодируем имя файла
$hash=explode('hash=',$hash[0]);
$hash=$hash[0];
$key=base64_encode('key');//кодируем любой ключ
$ip = md5(getenv("REMOTE_ADDR").$key);//делаем уникальный hash на основе ip и ключа.
if ($hash == $ip)
{
header('Content-type: video/mp4');
header("X-Accel-Redirect:/video/".$filename);
}
else
{
header('Content-type: video/mp4');
header("X-Accel-Redirect:/video/zastavka.mp4"); //заствака - ваш ролик. Показывается если ссылку на ваш ролик кто-то спер.

}
?>


Генерируем ссылку перед вставкой в плеер:


<?php
$video_name='video_1223.mp4';
$file=base64_encode($video_name);//кодируем имя файла
$key=base64_encode('key');//кодируем свой ключ
$ip = md5(getenv("REMOTE_ADDR").$key);//делаем уникальный hash на основе ip и ключа
$link='http://site.ru/video.php?hash='.$ip.'filename'.$file;
?>

И далее уже $link вставляем в код плеера.
В данном случаи я дополнительно кодирую имя файла используя base64. :) Это тоже можно обойти, но уже не всем это дано. Лучше тут использовать свою кодировку.
elistratovСсылка на пост (Смотрели 23073)04.11.14 20:36     Ответить
Ваше имя*
 E-mail* (не публикуется)
 
 
Если пишете о проблеме, то приложите, пожалуйста, ссылку на свой плеер отсюда — Плеер: Файл > Код > Ссылка
Вставка кода — [code][/code] дублировать ответы на e-mail
1
des-n7o 04.11.14 - 22:23
Здравствуйте, подскажите пожалуйста как применить данный метод к Dle
2
elistratov 04.11.14 - 22:41
Привет. DLE не знаю. Нужно смотреть.
3
dmxp 01.12.14 - 01:08
1. В корень сайта с DLE залить файл video.php (код выше)
2. Разрешить в настройках DLE добавление php в шаблоны.
3. Публикацию видео организовать не через добавление новостей, а через статические страницы. В код статической страницы, через встроенный html редактор прописать php код:
<?php
$video_name='ваше_video.mp4';
$file=base64_encode($video_name);//кодируем имя файла
$key=base64_encode('key');//кодируем свой ключ
$ip = md5(getenv("REMOTE_ADDR").$key);//делаем уникальный hash на основе ip и ключа
$link='http://site.ru/video.php?hash='.$ip.'filename'.$file;
?>

4. В качестве ссылки в плеер загнать:
|code|<?= $link ?>|/code|
4
sakra 24.11.14 - 02:13
Ну с первой частью понятно — кинуть в корень.

А куда эту часть кода всунуть?


<?php
$video_name='video_1223.mp4';
$file=base64_encode($video_name);//кодируем имя файла
$key=base64_encode('key');//кодируем свой ключ
$ip = md5(getenv("REMOTE_ADDR").$key);//делаем уникальный hash на основе ip и ключа
$link='http://site.ru/video.php?hash='.$ip.'filename'.$file;
?>


5
elistratov 24.11.14 - 05:50
туда где выводится у вас плеер. вместо ссылки ставим переменную $link.
6
sakra 24.11.14 - 13:16
Т.е должно быть так, в статье [uppod video=$link] ?

А сам php куда пихать, в статью что ли? Или это продолжение video.php.

Извини, но я не могу разобраться.
7
elistratov 24.11.14 - 20:44
какой движок?
8
sakra 24.11.14 - 20:49
WP
9
makc007 30.01.15 - 16:38
Вы смогли на WP установить? Если да, поделитесь как.
10
Theuppo 21.02.15 - 20:02
Здравствуйте. Выше показан пример с одним файлом. А как быть с подключаемыми плейлистами .txt, в котором видео штук двадцаь? Учитывая вот этот кусок кода для одного файла? $video_name=’video_1223.mp4’;
11
edikfl 25.11.14 - 16:14
В чем суть не понял, а что помешает через скрипт сделать запрос к файлу video.php, а в заголовках ответа получить прямой путь к файлу?
12
elistratov 26.11.14 - 14:25
ну так если рассуждать… вообще ни как не защитить:) вы же его отдаете и я его в любом случаи получаю на свой комп, а значит смогу записать его в файлик на компе. с помощью таких методов вы отсекаете кучу народа которые могут воровать контент.
вообще будет шикарно если с в догонку к данному методу с помощью nginx сделать лимит на скорость отдачи файлов для одного пользователя. тогда тоже усложнит воровство. но как я уже говорил для много nginx потемки.
воровать контент будут пытаться, но увы.. у большенства это не получится.
13
wolflen 12.05.15 - 16:56
а как получить настоящую прямую ссылку к примеру из ссылки ссылка ?
14
PHPSID 18.01.15 - 06:20
Этот вариант прокатит от школоты, как и шифрование ссылок у uppod. Прямую ссылку можно получить. Вариант от Вироники не позволит получить пряму ссылку на сам файл без хэша.
15
Thor1985 26.12.14 - 06:01
А не проще просто на серве в htacces блок на свой домен поставить? зачем чтото еще изобретать?
16
elistratov 26.12.14 - 16:41
конечно можно, но тогда воровать будут легко обойти… а данный метод прост и имеет хорошую фишку, которая может принести пользу… похоже вы ее не заметили.
17
nikitasius 15.01.15 - 21:38
Защита оригинального файла.

Оригинальный файл можно прятать за символическими ссылками.
Пример: example.com/content/y2015/2015video_party.mp4 — внутренний путь, который наружу никогда не светится.
делаем символическую ссылку на папку y2015 в корень сайта (к примеру), называет ее хешем от каких-либо данных, например будет "abcdef123",
example.com/abcdef123/2015video_party.mp4
Это защитит от прямых скачиваний, но спасет от скачиваний с разных IP.

Чтобы ввести ограничения на скачивания файлов по IP, можно поиграть с регулярками в nginx и значением IP адреса клиента и получить что-то вроде ab2cd3ef, и чтобы эта строка фигурировала в пути к файлу в самом nginx.

То есть: клиент получил ссылку example.com/abcdef123/2015video_party.mp4
nginx в локальной пути дописал ab2cd3ef после abcdef123 и в итоге выдал клиенту файл ПО ссылке example.com/abcdef123/2015video_party.mp4 из локального каталога /abcdef123/ab2cd3ef/ .

Если по аналогичной ссылке "example.com/abcdef123/2015video_party.mp4" запросит другой пользователь, то хвостик "ab2cd3ef" будет отличатся, и соотвественно nginx каталок и файл не найдет и выдаст 404.

Для этого надо уметь работать с linux (на уровне ln создания ссылки и rm удаления ссылки через 24 часа или сколько надо) и иметь доступ к файловой системе.

Это самая простая реализация и менее ресурсозатратная, так как по сути мы имеем:
-логика в конфиге nginx
-скрипт на PHP (или любом другом языке) вызывается в момент генерации ссылки
-скрипт в cron, который запускается раз в 10 минут, делает по базе выборку истекших ссылок и удаляет символические ссылки, который им соответствуют.
18
PHPSID 17.01.15 - 21:22
Проще в DLE все по шаблону делать. Прямую ссылку кидать в доп. поле и чтобы автоматом выводило уже кодированную при заходе на страницу с видео ссылку. /engine/modules/addnews.php (если не ошибаюсь) добавить код для генерации ссылки, если тег объявлен. Делов на 5 минут. Там вроде макросы как раз прописываются для вывода в шаблоне.
19
sexygerls 18.01.15 - 22:07
Всем привет в DLE 9.8

1. В корне сайта создал файл video.php с кодом который дан выше

все видео файлы проигрываются плеером uppod, соответственно в файле engine\classes\parse.class.php есть код

$decode_url = $url;


if ( count($sizes) == 2 ) $decode_url = $width."x".$height.",".$decode_url;

if ( stripos ( $url, "rtmp:" ) === false ) $detect_rtmp = false; else $detect_rtmp = true;

if( $type == "flv" or $type == "mp4" or $type == "m4v" or $type == "m4a" or $type == "mov" or $type == "3gp" or $type == "f4v" or $detect_rtmp) {
$url = array ();
$url = implode( ", ", $url );
$id_player = md5( microtime() );
return "<!--dle_video_begin:{$decode_url}-->
<object id=\"videoplayer-{$id_player}\" type=\"application/x-shockwave-flash\"
data=\"" . $config['http_home_url'] . "engine/classes/flashplayer/uppod.swf\" width=\"825\" height=\"500\">
<param name=\"allowFullScreen\" value=\"true\" />
<param name=\"allowScriptAccess\" value=\"always\" />
<param name=\"wmode\" value=\"transparent\" />
<param name=\"movie\" value=\"" . $config['http_home_url'] . "engine/classes/flashplayer/uppod.swf\" />
<param name=\"flashvars\" value=\"comment="."&st=" . $config['http_home_url'] . "engine/classes/flashplayer/skin.txt&file={$decode_url}\" />
</object><!--dle_video_end-->";


Знатоки php подскажите куда этот код нужно вставить

$video_name='video_1223.mp4';
$file=base64_encode($video_name);//кодируем имя файла
$key=base64_encode('key');//кодируем свой ключ
$ip = md5(getenv("REMOTE_ADDR").$key);//делаем уникальный hash на основе ip и ключа
$link='http://site.ru/video.php?hash='.$ip.'filename'.$file;

Пробовал сделать так

$decode_url = $url;


if ( count($sizes) == 2 ) $decode_url = $width."x".$height.",".$decode_url;

if ( stripos ( $url, "rtmp:" ) === false ) $detect_rtmp = false; else $detect_rtmp = true;

if( $type == "flv" or $type == "mp4" or $type == "m4v" or $type == "m4a" or $type == "mov" or $type == "3gp" or $type == "f4v" or $detect_rtmp) {
$url = array ();
$url = implode( ", ", $url );
$id_player = md5( microtime() );

$video_name=($decode_url);
$file=base64_encode($video_name);//кодируем имя файла
$key=base64_encode('key');//кодируем свой ключ
$ip = md5(getenv("REMOTE_ADDR").$key);//делаем уникальный hash на основе ip и ключа
$link='http://site.ru/video.php?'.$ip.'filename'.$file;

return "<!--dle_video_begin:{$link}-->
<object id=\"videoplayer-{$id_player}\" type=\"application/x-shockwave-flash\"
data=\"" . $config['http_home_url'] . "engine/classes/flashplayer/uppod.swf\" width=\"825\" height=\"500\">
<param name=\"allowFullScreen\" value=\"true\" />
<param name=\"allowScriptAccess\" value=\"always\" />
<param name=\"wmode\" value=\"transparent\" />
<param name=\"movie\" value=\"" . $config['http_home_url'] . "engine/classes/flashplayer/uppod.swf\" />
<param name=\"flashvars\" value=\"comment="."&st=" . $config['http_home_url'] . "engine/classes/flashplayer/skin.txt&file={$link}\" />
</object><!--dle_video_end-->";


но вылетает ошибка в плеере video.php?17e5459b8301a2c72dc05ef29aee68f8filenameaHR0cDovL3Rlc3QuaW5mby92aWRlby9Qb2lzb24ubXA0 не найден
20
PHPSID 18.01.15 - 22:19
Все верно сделано. Это из-за NGINX подозреваю. Скопируйте ссылку и откройте без плеера, скорей всего 404 nginx будет.
21
sexygerls 19.01.15 - 00:23
Так и есть, но как решить этот вопрос тестировал это все на openserver, попробую на денвере сейчас
22
sexygerls 19.01.15 - 00:53
На денвере совсем другой случай происходит
При добавлении в новость видео с ссылкой

http://test.info/video/Cappella.mp4

после её публикации она становится

http://test.info/video.php?17e5459b8301a2c72dc05ef29aee68f8filenameaHR0cDovL3Rlc3QuaW5mby92aWRlby9DYXBwZWxsYS5tcDQ=

если её открыть в браузере скачивается или открывается файл video.php пустой
23
PHPSID 14.03.15 - 03:27
Попробуйте добавить вместо
header("X-Accel-Redirect:/video/".$filename);

это

header("Content-type: application/octet-stream");
header("Content-type: video/mp4"); // В зависимости flv/mp4
header("Content-disposition: attachment; /video/".$filename);

По сути еще нужен readfile();
"Поиграйте" с первыми двумя заголовками, удалите, оставьте. Должно сработать.
24
sexygerls 02.02.15 - 23:30
Всем привет, вот добрался к собственному вопросу и отвечаю же на него все работает отлично правильный код

$decode_url = $url;


if ( count($sizes) == 2 ) $decode_url = $width."x".$height.",".$decode_url;

if ( stripos ( $url, "rtmp:" ) === false ) $detect_rtmp = false; else $detect_rtmp = true;

if( $type == "flv" or $type == "mp4" or $type == "m4v" or $type == "m4a" or $type == "mov" or $type == "3gp" or $type == "f4v" or $detect_rtmp) {
$url = array ();
$url = implode( ", ", $url );
$video_name=$decode_url;
$file=base64_encode($video_name);//кодируем имя файла
$key=base64_encode('key');//кодируем свой ключ
$ip = md5(getenv("REMOTE_ADDR").$key);//делаем уникальный hash на основе ip и ключа
$link='/video.php?hash='.$ip.'filename'.$file;
$id_player = md5( microtime() );
return "<!--dle_video_begin:{$decode_url}-->
<object id=\"videoplayer-{$id_player}\" type=\"application/x-shockwave-flash\"
data=\"" . $config['http_home_url'] . "engine/classes/flashplayer/uppod.swf\" width=\"825\" height=\"500\">
<param name=\"allowFullScreen\" value=\"true\" />
<param name=\"allowScriptAccess\" value=\"always\" />
<param name=\"wmode\" value=\"transparent\" />
<param name=\"movie\" value=\"" . $config['http_home_url'] . "engine/classes/flashplayer/uppod.swf\" />
<param name=\"flashvars\" value=\"comment="."&st=" . $config['http_home_url'] . "engine/classes/flashplayer/skin.txt&file={$link}\" />
</object><!--dle_video_end-->";


а ссылка на видео в DLE при создании новости будет такая [video=Cappella.flv]
в итоге для посетителей ссылка на видео будет
http://test.info/video.php?hash=17e5459b8301a2c72dc05ef29aee68f8filenameQ2FwcGVsbGEuZmx2

Это условие работает если есть папка video на вашем сайте и там есть файл Cappella.flv

Вопрос к знатокам PHP как вставить ссылку с стороннего сайта например ссылка что бі она имела вид такой ссылка
после установки в плеер

25
sexygerls 03.02.15 - 00:00
Да забыл исправить строку
return "<!--dle_video_begin:{$decode_url}-->
на
return "<!--dle_video_begin:{$link}-->
а то при просмотре исходного кода ссылка палится, а так все зашифровано
26
sexygerls 04.02.15 - 02:36
Похоже общаюсь в этой ветке я сам собой, отвечу может кому нибудь понадобится. Проблему со сторонними ссылками решается через плейлист, где в папку например video бросаете файл в формате .txt а в нем прописываете стороннюю ссылку. в коде плеера вместо строки file={$link} пишите pl={$link}. Но есть одна трудность которую я не решил, при просмотре исходного кода ссылка выглядит в виде
http://test.info/video.php?hash=17e5459b8301a2c72dc05ef29aee68f8filenameUG9pc29uLm1wNA==
, т.е. ссылка скрыта, а если просмотреть ссылку с помощью DownloadHelper то она не как не защищена и вид её такой
http://test.info/video/Cappella.mp4


Скажите может что то нужно еще прописать video.php кроме упомянутого кода?
27
dsqwared 21.02.15 - 05:58
Всем привет, попробовал ваш вариант с video.php, закинул на сайт, сделал примитивную форму, для шифрования ссылки, с кодом
<?php
$video_name='video_1223.mp4';
$file=base64_encode($video_name);//кодируем имя файла
$key=base64_encode('key');//кодируем свой ключ
$ip = md5(getenv("REMOTE_ADDR").$key);//делаем уникальный hash на основе ip и ключа
$link='http://site.ru/video.php?hash='.$ip.'filename'.$file;
?>


вставляю шифрованную ссылку в плеер uppod, все работает, видео проигрывается…

меняю себе ip, захожу на сайт, а мне теперь показывается видео-заглушка. И это понятно, ведь проверка на IP идет. Я так понимаю, что по данному коду, если я сгенерировал ссылку, то кроме меня ее никто не просмотрит, и всем остальным будет показывать заглушка… То ли я что-то не так понял… Как сделать так, чтобы я генерировал ссылку, и она показывалась всем, а если захотят скачать, вот тогда и заглушку чтоб качали…
28
8MILLENNIUM8 15.08.15 - 16:32
На самом деле через плей листы очень не удобно, особенно если парсишь =), намного проще вставить такой код
[code]header("Location: ".$filename);[code/]
вместо этого
[code]header("X-Accel-Redirect:/video/".$filename);[code/]
и будет чудо
29
8MILLENNIUM8 15.08.15 - 16:36
На самом деле через плей листы очень не удобно, особенно если парсишь =), намного проще вставить такой код
header("Location: ".$filename);

вместо этого
header("X-Accel-Redirect:/video/".$filename);

и будет чудо, оно начнет не отдавать с сервера а редиректить на нужную ссылку
30
sexygerls 10.09.15 - 11:08
чудо есть но не совсем, да при просмотре исходного кода страницы ссылка кодирована например в виде,
ttp://test.info/video.php?hash=17e5459b8301a2c72dc05ef29aee68f8filenameUG9pc29uLm1wNA==
но при проигрывании в плеере DownloadHelper показывает ссылку в чистом виде не защищенную, например ссылка
31
Theuppo 21.02.15 - 18:08
Кому-нибудь удалось сделать подобную защиту на ucoz (сериалы с плейлистами)? Видел работающее решение на сайте онлайнфильм. Может поделитесь информацией или поможете с установкой (разумеется не бесплатно)?
32
Olejko 25.02.15 - 14:15
Добрый день!
Подскажите, а можно ли этим способом защитить потоковое (live) видео ?
33
dsqwared 25.02.15 - 17:25
Помогите знатоки, уже 3 дня парюсь, не могу сделать… Подскажите как в файле video.php проверить ссылка вида
http://site.ru/video.php?hash=271ac285a54bccaab18b99949b0ecf62filenameQnV0dHBsdWdzX3RhcG9uX2FuYWxfZGVfU2hvdHNfVG95cy5tcDQ=
была вызвана на прямую в строке поиска или в тексте программы ???

У меня получается так, что видео работает, на сайте, и когда ссылку вставляешь в строку поиска то правой кнопкой->скачать скачивается на компьютер без проблем
34
fanaticus 14.05.15 - 21:08
Что то не работает. Кто может помочь ?
35
filmfree 02.09.15 - 05:30
Я защитил свои ссылки простым методом:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^ссылка)?сайт\.ru/ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?google. [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?yandex. [NC]
RewriteRule \.(flv|mp4)$ — [F]

По сути тогда шифрование вообще не нужно?
Но как запретить скачивать по ссылкам, а только просматривать через плеер на сайте?
36
elistratov 02.09.15 - 05:51
а вы вообще поняли что вы сделали?

Во-первых, разберитесь более детально в правилах. В данном случаи метод не работает. Перед RewriteRule \.(flv|mp4)$ — [F] еще что-то должно быть.(не буду говорить что, изучите сами).
Из сформированных вами вопрос я понял что вы вообще не поняли что сделали)))
По факту — вы должны указать путь к плееру и сказать что через вот него можно смотреть, а на прямую никому не давать качать.

Во-вторых, даже если вы все правильно сделаете, это срабатывает в Chrome, Opera и даже IE, то есть скачать нельзя, но в плеере просмотреть можно. Но не для браузеров Mozilla и Safari. Проблема в формировании GET запросов в этих браузерах.

P.S.: ну и как я уже писал. мой метод очень прост и до беспредела гениален — зачем бороться с копированием, если все равно скопируют. я "скамуниздю" с любого сайта видео, а вернее ссылку на виде, само видео как привило нафик не кому не нужно. А ведь это и делается в 99% случаев. Так может лучше обратить ситуацию для себя в пользу? тот кто шарит — тот поймет о чем я и допилит метод :)

P. S. S.: суть не в методе, а в идеологии ;)
37
filmfree 02.09.15 - 07:02
Я то понял, что я сделал.

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http ://(www\./)?мой-сайт\.ru/ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?сайт-друг-1. [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?сайт-друг-2. [NC]
RewriteRule \.(flv|mp4)$ — [F]

Теперь видео flv|mp4 проигрывается только на моём сайте и ещё двух сайтах №1 и №2, моих же сайтах.
А те кто ранее копировали мои прямые ссылки и вставляли к себе на сайты получают сейчас вот такое в плеере:
"Аn error occured while reading video"
38
filmfree 02.09.15 - 07:06
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http ://(www\./)?мой-сайт\.ru/ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?сайт-друг-1. [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?сайт-друг-2. [NC]
RewriteRule \.(flv|mp4)$ — [F]


Уже несколько лет пользуюсь таким способом и проблем нет.
Правда отвалилось часть аудитории, которая копировала мои ссылки к себе на сайты.
39
sexygerls 10.09.15 - 10:59
Ну если видео находится на одном хосте а сайт на другом, как защитить видео от копирования?
40
filmfree 02.09.15 - 07:11
Просто в моём случае уже не вижу смысла кодировать ссылки. Зачем?
Есть только желание не разрешать пользователям скачивать видео, а только просматривать через плеер.
Ссылка элементарно берётся со страницы с видео прогой Flash Video Downloader, например.
41
olegaby 01.10.15 - 03:34

filmfree, защита по реферу не срабатывает в мозилле, по крайней мере в моей версии браузера.
42
airat163 02.03.16 - 17:36
Всем добра. Имеется плеер. В нем соотв. путь для видео файла. Когда прописываю этот путь напрямую ссылка, то перемотка видео работает. Могу смотреть видео хоть с середины. А вот когда в пути видео прописываю video.php

содержимое video.php :

header(’Content-type: video/mp4’);
header("X-Accel-Redirect:/video/video.mp4");

то видео начинает проигрываться, а вот перемотка уже не пашет. Как решить проблему?
43
airat163 08.03.16 - 01:27
Вот нет!(((( пробовал до этого /video/video.mp4?start=$start и нет. Сейчас опять попробовал и снова нет(((((( Спать не дает эта проблема. Поэтому и не могу использовать данный метод шифрования(
Сообщить об ошибке на сайте
 Uppod © 2008–2020
Сообщить об ошибке на сайте
Если ошибка относится к плееру, а не сайту, либо Вы хотите получить ответ на вопрос —
лучше написать на форуме