Предотвратить загрузку видео HTML5 (щелчок правой кнопкой мыши сохранен)?

173

Как отключить «Сохранить видео как ...» в меню браузера, вызываемом правой кнопкой мыши, чтобы клиенты не могли загружать видео?

Существуют ли более полные решения, которые не позволяют клиенту получить прямой доступ к пути к файлу?

питон
источник
3
Я проголосовал за этот вопрос, потому что он только абсолютно спрашивает, как «отключить щелчок правой кнопкой мыши» для видео HTML5. Я не уверен, что это похоже на отключение правой кнопкой мыши для обычных изображений или есть другие приемы наложения и т. Д., Которые можно применить.
3
Даже если вы отключите щелчок правой кнопкой мыши, они все равно смогут сохранить его из меню браузера ( File→Save As). Даже если вы можете как-то заблокировать это, они могут просмотреть исходный код, чтобы найти URL файла. Даже если вы можете немного это скрыть, они могут вырвать его из кеша. Даже если вы можете усложнить это (например, поток), они могут захватывать сетевой трафик с помощью анализатора или чего-то еще. Дело в том, что если вы отправите его пользователю, он может его сохранить. Обойти это невозможно. Вопрос, который вам нужно задать, - почему вам нужно так сильно это остановить. Это действительно даже необходимо? Стоит ли это усилий и недружественных пользователей?
Synetech
Мне нравится TxRegex, отвечайте лучше всего как быстрое базовое решение.
Jsherk
Я собираюсь выглядеть педантично здесь, но вы перегружаете термин «загрузка». Вы, конечно , хотите разрешить загрузку видео.
Йохан Буле

Ответы:

227

Вы не можете . Это потому, что браузеры предназначены для этого: обслуживать контент . Но вы можете усложнить загрузку .

Во-первых, вы можете отключить contextmenuсобытие , так называемый «правый клик». Это помешает вашему обычному заносу нагло копировать видео, щелкнув правой кнопкой мыши и сохрани как. Но тогда они могли бы просто отключить JS и обойти это или найти источник видео через отладчик браузера. Плюс это плохой UX. В контекстном меню есть много законных вещей, кроме «Сохранить как».

Вы также можете использовать пользовательские библиотеки видеоплееров. В большинстве из них реализованы видеоплееры, которые настраивают контекстное меню по вашему вкусу. Таким образом, вы не получите контекстное меню браузера по умолчанию. И если когда-либо они будут обслуживать пункт меню, похожий на Сохранить как, вы можете отключить его. Но опять же, это обходной путь JS. Недостатки аналогичны предыдущему варианту.

Еще один способ сделать это - показать видео с помощью HTTP Live Streaming . По сути, он нарезает видео на куски и подает их один за другим. Именно так большинство потоковых сайтов обслуживают видео. Таким образом, даже если вам удастся сохранить как, вы сохраните только фрагмент, а не все видео. Потребовалось бы немного больше усилий, чтобы собрать все куски и сшить их с помощью специального программного обеспечения.

Другой метод заключается в краска <video>на<canvas> . В этой технике с небольшим количеством JavaScript, что вы видите на странице, это <canvas>элемент рендеринга кадров из скрытого <video>. И потому что это <canvas>, контекстное меню будет использовать <img>меню, а не <video>. Вы получите «Сохранить изображение как» вместо «Сохранить видео как».

Вы также можете использовать токены CSRF в своих интересах. Ваш сервер отправит токен на страницу. Затем вы используете этот токен для получения вашего видео. Ваш сервер проверяет, является ли он действительным токеном, прежде чем отправлять видео или получить HTTP 401 . Идея состоит в том, что вы можете получить видео только при наличии токена, который вы сможете получить только при переходе со страницы, а не при прямом посещении URL-адреса видео.

В конце дня я просто загрузил бы свое видео на сторонний видео-сайт, такой как YouTube или Vimeo. У них есть хорошие инструменты для управления видео, которые оптимизируют воспроизведение на устройстве, и они прилагают усилия для предотвращения копирования их видео без каких-либо усилий с вашей стороны.

Джозеф
источник
1
спасибо за подробный ответ, возможно ли хотя бы отключить опцию сохранить как из меню правой кнопки мыши? это покроет большинство случаев базовых знаний
питон
2
это зависит от браузера. Я видел времена (особенно Firefox и Chrome), что если видео полностью загружено, когда вы нажимаете «сохранить», они просто выбирают видео из кеша, а не перезагружают (видео уже загружено в кеш, зачем скачивать его снова?), таким образом, нет второго запроса. описанный выше метод применим только тогда, когда ссылка используется повторно.
Иосиф
1
ну, я нашел статью, в которой говорилось о наложении тега video на div. обновил мой ответ
Джозеф
2
Спасибо. Я только что прочитал craftymind.com/factory/html5video/CanvasVideo.html . Идея почти такая же, как ваш ответ.
Трунг
1
@Cupidvogel «URL-адрес одноразового использования» - это конечная точка сервера, которая принимает токен, сгенерированный сервером. Токен генерируется при генерации страницы и сохраняется в БД. Это также отправлено со страницей srcот <video>. К тому времени, когда ваша страница загружена, у БД есть токен, у страницы есть токен. Как только <video>начинается загрузка (обращается к конечной точке), сервер проверяет наличие токена в БД, удаляет его и передает файл в потоковом режиме. Если токен отсутствует в результате второго доступа , не передавайте файл в потоковом режиме.
Иосиф
118

Это простое решение для тех, кто хочет просто удалить правую кнопку «сохранить» из видео html5

$(document).ready(function(){
   $('#videoElementID').bind('contextmenu',function() { return false; });
});
Клейтон Граул
источник
Это фантастика ! Это делает большую работу по предотвращению загрузки видео обычными людьми!
Этьен Ноэль
2
Это не поможет, однако, если JavaScript отключен в браузере.
mvark,
2
Спасибо, этого решения достаточно для 90% всех наших посетителей.
Кай Ноак
2
BLEH. Просто осмотрите элемент в Firebug, посмотрите srcатрибут и откройте его на другой вкладке или используйте wgetдля его загрузки!
SexyBeast
11
Я думаю, что главная цель этого состоит в том, чтобы избежать "нормальных" пользователей, чтобы загрузить видео. Это хорошее решение, чтобы решить эту ситуацию.
Унапедра
37

Простой ответ,

ВЫ НЕ МОЖЕТЕ

Если они смотрят ваше видео, оно уже есть

Вы можете замедлить их, но не можете их остановить.

Starx
источник
Кстати, этот ответ применим к HTML5-видео, флеш-видео или любым технологиям, которые вы можете себе представить в будущем. Все просто: это как это работает.
Густаво Родригес
А как насчет YouTube? На YouTube вы не можете легко найти видеофайл. Я имею в виду, что хорошо, вы правы, мы можем, но легко спрятать источник mp4 на youtube или похожем видеохостинге, чем разместить простой mp4 на нашем сервере и использовать проигрыватель html5.
длопезгонзалез
2
Это не ответ ни на один из вопросов.
Цханд
1
Люди могут записывать весь экран и аудио и обманывать все обходные пути, поэтому их можно только замедлить.
кинцукурой
1
@IlanSchemoul Интересно. Спасибо за обмен :)
Starx
33

Да, вы можете сделать это в три этапа:


  1. Поместите файлы, которые вы хотите защитить, в подкаталог каталога, в котором работает ваш код.

    www.foo.com/player.html
    www.foo.com/videos/video.mp4

  2. Сохраните файл в этом подкаталоге с именем «.htaccess» и добавьте строки ниже.

    www.foo.com/videos/.htaccess

    #Contents of .htaccess
    
    RewriteEngine on
    RewriteCond %{HTTP_REFERER} !^http://foo.com/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://www.foo.com/.*$ [NC]
    RewriteRule .(mp4|mp3|avi)$ - [F]

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

  1. Для более полного решения , теперь подайте видео с помощью флеш-плеера (или html canvas) и никогда не делайте ссылки на видео напрямую. Чтобы просто удалить контекстное меню, добавьте в ваш HTML:

    <body oncontextmenu="return false;">


Результат:

www.foo.com/player.html будет правильно воспроизводить видео , но если вы посетите www.foo.com/videos/video.mp4:

Код ошибки 403: ЗАПРЕЩЕНО


Это будет работать для прямой загрузки, cURL, хотлинкинга, вы называете это.

Это полный ответ на два заданных вопроса, а не ответ на вопрос: «могу ли я запретить пользователю загружать видео, которое он уже скачал».

Tzshand
источник
1
Отличный ответ, но у вас есть `то, что вы должны удалить его из своего .htaccessконтента
MAZux
2
Вы все еще можете подделать HTTP Referer, который позволит человеку скачивать. Однако это очень умное решение. Если вы забьете это с одноразовым кодом в файле, вы можете идти!
Широй
Кажется, еще IDM может скачать его!
PersianMan
@PersianMan Правильно - я призываю вас прочитать первые ответы
Цханд
1
Если вы отключите JavaScript из браузера, этот трюк не будет работать, с тех пор активируется правый клик. Чтобы избежать этого, вы также должны извлекать и загружать видео элемент динамически, используя jquery.
Анинда Санкар Дасгупта
23

Лучший способ, которым я обычно пользуюсь, - это очень просто, я полностью отключаю контекстное меню на всей странице, чистый html + javascript:

 <body oncontextmenu="return false;">

Это оно! Я делаю это, потому что вы всегда можете увидеть источник, щелкнув правой кнопкой мыши.
Хорошо, вы говорите: «Я могу использовать источник просмотра непосредственно из браузера», и это правда, но мы начнем с того, что вы НЕ МОЖЕТЕ прекратить скачивать html5видео.

Даниэле Каннова
источник
Я думаю, что решение должно быть тем, которое не мешает «нормальным» пользователям, отключение правого клика не позволит пользователям копировать и вставлять текст или искать слово, в которое они пересекаются, например, в названии видео, конечно же, нет. все пользователи, вероятно, сделают это, но это может раздражать некоторых из них
Джон Балвин Ариас
14

Как разработчик на стороне клиента, я рекомендую использовать URL-адрес BLOB-объекта, URL-адрес BLOB-объекта - это URL-адрес клиента, который ссылается на двоичный объект

<video id="id" width="320" height="240"  type='video/mp4' controls  > </video>

в HTML оставьте ваше видео srcпустым, а в JS извлеките видеофайл с помощью AJAX, убедитесь, что тип ответа - blob

window.onload = function() {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'mov_bbb.mp4', true);
    xhr.responseType = 'blob'; //important
    xhr.onload = function(e) {
        if (this.status == 200) {
            console.log("loaded");
            var blob = this.response;
            var video = document.getElementById('id');
            video.oncanplaythrough = function() {
                console.log("Can play through video without stopping");
                URL.revokeObjectURL(this.src);
            };
            video.src = URL.createObjectURL(blob);
            video.load();
        }
    };
    xhr.send();
}

Примечание: этот метод не рекомендуется для больших файлов

РЕДАКТИРОВАТЬ

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

  • если видео доставлено API, используйте другой метод (PUT / POST) вместо 'GET'

Sajan
источник
3
YouTube тоже использует Blob, я думаю :)?
C0nw0nk
1
Можете ли вы объяснить, что здесь происходит, и как настроить сервер для этого?
Энтони
1
@nerdofcode, как это ведет себя, когда пользователи пытаются переслать видео? Нужно ли будет ждать, пока все видео загрузят?
Джон Балвин Ариас
1
@JohnBalvinArias! Я не проверял это 100%, но я собираюсь сказать, что для этого нужен только быстрый буфер ... Не
цитируйте
1
Если я осматриваю страницу, на вкладке Сеть я получаю запрос на видео, которое я могу просто открыть на новой вкладке.
Симона
10

PHP отправляет тег видео html5 вместе с сеансом, где ключом является случайная строка, а значением является имя файла.

ini_set('session.use_cookies',1);
session_start();
$ogv=uniqid(); 
$_SESSION[$ogv]='myVideo.ogv';
$webm=uniqid(); 
$_SESSION[$webm]='myVideo.webm';
echo '<video autoplay="autoplay">'
    .'<source src="video.php?video='.$ogv.' type="video/ogg">'
    .'<source src="video.php?video='.$webm.' type="video/webm">'
    .'</video>'; 

Теперь PHP попросили отправить видео. PHP восстанавливает имя файла; удаляет сеанс и мгновенно отправляет видео. Кроме того, должны присутствовать все заголовки «без кеша» и mime-типа.

ini_set('session.use_cookies',1);
session_start();
$file='myhiddenvideos/'.$_SESSION[$_GET['video']];
$_SESSION=array();
$params = session_get_cookie_params();
setcookie(session_name(),'', time()-42000,$params["path"],$params["domain"],
                                         $params["secure"], $params["httponly"]);
if(!file_exists($file) or $file==='' or !is_readable($file)){
  header('HTTP/1.1 404 File not found',true);
  exit;
  }
readfile($file);
exit:

Теперь, если пользователь скопирует URL в новой вкладке или воспользуется контекстным меню, ему не повезет.

BF
источник
Мне нравится решение - оно решает вопрос ОП. Одна неприятная вещь, когда проверяет исходный код в Chrome и щелкает правой кнопкой мыши по ссылке. Пользователь загрузит html-файл, который фактически будет видео-файлом.
user1252280
5

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

oncontextmenu="return false;"

Это работает для элемента body (целой страницы) или только для одного видео, использующего его внутри тега video.

<video oncontextmenu="return false;" controls>...</video>
TxRegex
источник
5

В итоге мы использовали AWS CloudFront с устаревшими URL-адресами. Видео будет загружено, но к тому времени, когда пользователь щелкнет правой кнопкой мыши и выберет Сохранить как, URL-адрес видео, который он первоначально получил, истек. Выполните поиск CloudFront Origin Access Identity.

Для создания URL-адреса видео требуется пара ключей, которую можно создать в интерфейсе командной строки AWS. К вашему сведению, это не мой код, но он прекрасно работает!

$resource = 'http://cdn.yourwebsite.com/videos/yourvideourl.mp4';
$timeout = 4;

//This comes from key pair you generated for cloudfront
$keyPairId = "AKAJSDHFKASWERASDF";

$expires = time() + $timeout; //Time out in seconds
$json = '{"Statement":[{"Resource":"'.$resource.'","Condition" {"DateLessThan":{"AWS:EpochTime":'.$expires.'}}}]}';     

//Read Cloudfront Private Key Pair
$fp=fopen("/absolute/path/to/your/cloudfront_privatekey.pem","r"); 
$priv_key=fread($fp,8192); 
fclose($fp); 

//Create the private key
$key = openssl_get_privatekey($priv_key);
if(!$key)
{
    echo "<p>Failed to load private key!</p>";
    return;
}

//Sign the policy with the private key
if(!openssl_sign($json, $signed_policy, $key, OPENSSL_ALGO_SHA1))
{
    echo '<p>Failed to sign policy: '.openssl_error_string().'</p>';
    return;
}

//Create url safe signed policy
$base64_signed_policy = base64_encode($signed_policy);
$signature = str_replace(array('+','=','/'), array('-','_','~'), $base64_signed_policy);

//Construct the URL
$url = $resource.'?Expires='.$expires.'&Signature='.$signature.'&Key-Pair-Id='.$keyPairId;

return '<div class="videowrapper" ><video autoplay controls style="width:100%!important;height:auto!important;"><source src="'.$url.'" type="video/mp4">Your browser does not support the video tag.</video></div>';
ProPhoto
источник
1
Сильно недооцененный комментарий. Я бы посоветовал использовать docs.aws.amazon.com/sdk-for-php/v3/developer-guide/… однако в настоящее время.
Zmart
Если токен истекает, значит ли это, что он не может перемещаться по видео? Поскольку это, кажется, связывается с URL видео снова.
Chud37
4

Мы могли бы сделать это не так просто, скрыв контекстное меню, например так:

<video oncontextmenu="return false;"  controls>
  <source src="https://yoursite.com/yourvideo.mp4" >
</video>
Jcyrss
источник
3

+1 простой и кросс-браузерный способ: вы также можете поместить прозрачное изображение поверх видео с помощью css z-index и opacity. Таким образом, пользователи увидят «сохранить изображение как» вместо «сохранить видео» в контекстном меню.

Алекс Бабак
источник
2
почему рис это займет время, чтобы загрузить, поэтому только поместите тег div, и они получат большое меню хрома, как перезагрузка и т. д.
Waqas Tahir
Я не уверен, но все же видео можно загрузить через File> SaveAs
Arun Kumar
3

The

<body oncontextmenu="return false;"> 

больше не работает. Chrome и Opera по состоянию на июнь 2018 года имеют подменю на временной шкале для прямой загрузки, поэтому пользователю не нужно щелкать правой кнопкой мыши, чтобы загрузить это видео. Интересно, что у Firefox и Edge этого нет ...

kendolew
источник
2

Используя сервис, такой как Vimeo: войдите в систему Vimeo > Goto Video > Settings > Privacy > Mark as Secured, а также выберите встраивать домены. После настройки доменов для встраивания никому не разрешается встраивать видео или отображать его из браузера, если только он не подключается с указанных доменов. Так что, если у вас есть защищенная страница на вашем сервере, которая загружает проигрыватель Vimeo в iframe, это довольно сложно обойти.

CommentUser
источник
2

Прежде всего осознайте, что невозможно полностью предотвратить загрузку видео, все, что вы можете сделать, это сделать его более сложным . Т.е. вы скрываете источник видео.

Веб-браузер временно загружает видео в буфер, поэтому, если вы можете предотвратить загрузку, вы также запретите просмотр видео.

Вы также должны знать, что <1% от общей численности населения мира сможет понять исходный код, что делает его в любом случае довольно безопасным. Это не значит, что вы не должны скрывать это в источнике - вы должны .

Вы не должны отключать щелчок правой кнопкой мыши, и еще меньше вы должны отобразить сообщение с надписью "You cannot save this video for copyright reasons. Sorry about that.". Как предлагается в этом ответе .

Это может быть очень раздражающим и запутанным для пользователя. Помимо этого; если они отключат JavaScript в своем браузере, они будут иметь возможность правой кнопкой мыши и сохранить в любом случае.

Вот хитрость CSS, которую вы можете использовать:

video {
    pointer-events: none;
}

CSS нельзя отключить в браузере, защищая ваше видео, фактически не отключая правый клик. Однако одна проблема заключается в том, что она также controlsне может быть включена, другими словами, они должны быть установлены в false. Если вы собираетесь внедрить свою собственную функцию Play / Pause или использовать API, у которого есть кнопки, отдельные от videoтега, то это выполнимый вариант.

controls также есть кнопка загрузки, так что использовать ее тоже не очень хорошая идея.

Вот пример JSFiddle .


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

От TxRegex ответ :

<video oncontextmenu="return false;" controls>
    <source type="video/mp4" id="video">
</video>

Теперь добавьте видео через JavaScript:

document.getElementById("video").src = "https://www.w3schools.com/html/mov_bbb.mp4";

Функциональный JSFiddle


Другой способ предотвратить щелчок правой кнопкой мыши - использовать embedтег. Это, однако, не предоставляет элементы управления для запуска видео, поэтому они должны быть вставлены в JavaScript:

<embed src="https://www.w3schools.com/html/mov_bbb.mp4"></embed>
Саймон
источник
1
Добавление URL src через JavaScript не очень полезно. Проверка DOM покажет URL в поле зрения после того, как скрипт установит его.
Симона
@ Я согласен, но это лучше, чем показывать его прямо в html-источнике, где любой, кто щелкнет по нему правой кнопкой мыши, сможет увидеть его немедленно. Вы всегда можете разделить URL или зашифровать его. Но помните, что это дополнительная обработка
Симон
«CSS нельзя отключить в браузере» - Технически вы можете изменить CSS в инструментах разработчика веб-браузера, чтобы отключить определенные правила CSS, чтобы более технически подкованный человек мог их удалитьpointer-events: none;
Фил Гиббинс
2

ну, вы не можете защитить это на 100%, но вы можете сделать это сложнее. С этими методами, которые я объясняю, я столкнулся с ними во время изучения методов защиты в PluralSight и BestDotNetTraining. . тем не менее, ни один из этих методов не помешал мне загрузить то, что я хочу, но мне было трудно курировать загрузчик, чтобы пройти их защиту.

Помимо других упомянутых способов отключить контекстное меню. пользователь все еще может использовать сторонние инструменты, такие как InternetDownload manager или другое подобное программное обеспечение для загрузки видео. метод защиты, который я объясняю здесь, состоит в том, чтобы смягчить программное обеспечение сторонних производителей.

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

отказ

Я не буду нести никакой ответственности, если кто-то злоупотребляет этими методами или использует их для нанесения вреда другим лицам или веб-сайтам, которые я упомянул в качестве примера. это просто для обмена знаниями, чтобы помочь вам защитить свой интеллектуальный продукт.

генерировать ссылки с истечением срока действия

Для этого необходимо создать ссылку на скачивание для каждого пользователя. с этим можно легко справиться с помощью хранилища Azure BLOB или Amazon S3. Вы можете создать ссылку для скачивания с двойной отметкой времени окончания видео. тогда вам нужно захватить эту ссылку на видео и время, которое запрашивается. это необходимо для следующего метода. выгода этого метода заключается в том, что вы генерируете ссылку для скачивания, когда пользователь нажимает кнопку воспроизведения.

При нажатии кнопки воспроизведения вы отправите запрос на сервер, получите ссылку и обновите источник.

регулировать частоту запросов видео

Затем вы отслеживаете, насколько быстро пользователь запрашивает второе видео. если пользователь слишком быстро запросит ссылку для скачивания, вы сразу же заблокируете его. Вы не можете установить этот порог слишком большим, потому что вы можете по ошибке заблокировать пользователей, которые просто просматривают или просматривают видео.

Включить диапазон HTTP

используйте для воспроизведения видео некоторую библиотеку js, например videojs , также вам нужно вернуть AcceptRange в заголовок. Хранилище BLOB-объектов Azure поддерживает это "из коробки". Таким образом, браузер начинает загружать видео по частям. обычно 32 байта на 32 байта. Затем вам нужно прослушать timeupdateизменения videojs и обновить ваш сервер в процентах от просмотра видео. процент просмотра видео не может превышать процент доставки видео. и если вы поставляете видеоконтент без получения процентного изменения, вы можете заблокировать пользователя. потому что наверняка они скачивают.

реализовать это сложно, потому что пользователь может пропустить видео вперед или назад, поэтому имейте это в виду, когда реализуете это.

Вот как BestDotnetTraining обрабатывает timeupdate

myPlayer.ready(function () {
    //var player = this;
    this.src({
        type: "video/mp4",
        src: videoURL
    });
    if (videoId) {
        myPlayer.play();
        this.on('timeupdate', function () {
            var currentPercent = parseInt(100 * myPlayer.currentTime() / myPlayer.duration());//calcualte as percentage
            if (currentPercent % 5 == 0) {
                //send percentage to server 
                SaveVideoDurationWatched(currentPercent, videoId);
            }
        });
    }

});

в любом случае, пользователь может обойти это, используя некоторый метод загрузки, который загружает файл через потоковую передачу. почти c # сделать это из коробки, а для nodejs вы можете использовать requestмодуль. затем вам нужно запустить секундомер, прослушать полученный пакет и сравнить полученный полученный байт с общим размером. таким образом, вы можете рассчитать процент и время, потраченное на получение этого количества процентов. затем используйте Thread.Sleep()или что-то в этом роде, чтобы задержать поток на сумму, которую вам придется ждать, если вы смотрите видео нормально. также перед сном пользователь может вызвать сервер и обновить полученный процент. поэтому сервер считает, что пользователь на самом деле смотрит видео.

вычисление будет примерно таким, например, если вы подсчитаете, что вы уже получили 1 процент, то вы можете рассчитать сумму, которую вы должны ждать, чтобы усыпить поток загрузки. таким образом, вы не можете скачать видео быстрее, чем его фактическая длина. если видео 24 мин. загрузка займет 24 минуты. (плюс порог, который мы ставим в первом методе)

original video length 24 minute
24 min *60000 = 1,440,000 miliseconds 
1,440,000 % 100 = 14,400 milisecond is needed to download one percent

проверьте браузер агента

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

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

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

проверьте заголовок реферера

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

для этого необходимо иметь отображение видео и страницу, которая показывает это видео. Вы можете создать соглашение или шаблон, чтобы понять, каким должен быть URL, это зависит от вашего дизайна.

чтобы обойти это, пользователь может установить заголовок реферера вручную, равный URL страницы загрузки при загрузке видео.

Рассчитать время между запросами

если вы получаете так много запросов, что время между ними одинаково, то вам следует заблокировать пользователя. Вы должны указать это, чтобы узнать, сколько времени проходит между запросом на генерацию видео ссылки. если они одинаковы (плюс / минус некоторый порог) и это происходит более чем несколько раз, то вы можете забанить пользователя. потому что если есть бот, который будет сканировать ваш сайт или видео, то обычно они имеют одинаковое время ожидания между запросами. так что если вы получаете каждый запрос, например, каждые 1,3 (плюс / мин, некоторое отклонение) минуты. тогда вы поднимаете тревогу. для этого вы можете использовать статистический расчет, чтобы узнать отклонение между запросами.

Чтобы обойти это, пользователь может установить произвольное время ожидания между запросами.

образец кода

У меня есть репозиторий PluralSight-Downloader, который делает это на полпути. Я создал этот репо почти 5 лет назад. Поскольку я написал его для учебных целей и только для личного использования, репозиторий до сих пор не получил никаких обновлений, и я не собираюсь обновлять или облегчать работу с ним. это просто пример того, как это можно сделать.

Мо Град А
источник
1

Короткий ответ: зашифруйте ссылку, как это делает youtube, не знаю как, чем спросить youtube / google о том, как они это делают. (На всякий случай, если вы хотите, чтобы прямо в точку.)

Я хотел бы указать кому-либо, что это возможно, потому что это делает YouTube, и если они могут, то может любой другой веб-сайт, и это не из браузера, потому что я протестировал его на нескольких браузерах, таких как Microsoft Edge и Internet Explorer и так что есть способ отключить его и увидеть, что люди все еще говорят это ... Я пытаюсь найти ответ, потому что если YouTube может, то должен быть способ и единственный способ увидеть, как они это делают, если кто-то заглянул в сценарии YouTube, которые я делаю сейчас. Я также проверил, было ли это пользовательское контекстное меню, и это не потому, что контекстное меню переполняет элемент inspect, и я имею в виду, что оно поверх него, и я посмотрел, и он никогда не создает новый класс, а также на самом деле невозможно получить доступ к элементу проверки с помощью JavaScript, так что это не может быть. Когда вы дважды щелкаете правой кнопкой мыши по видео на YouTube, вы можете сказать, что оно вызывает контекстное меню для Chrome. Кроме того ... YouTube не добавил бы эту функцию. Я занимаюсь исследованием и просматриваю источник YouTube, поэтому я вернусь, если найду ответ ... если кто-то скажет, что вы не можете, чем, ну, они не сделали " не делаю исследования, как у меня. Единственный способ скачать видео с YouTube - это скачать видео.

Хорошо ... Я провел исследование, и мое исследование остается в том, что вы можете отключить его, за исключением того, что нет никакого javascript к нему ... Вы должны быть в состоянии зашифровать ссылки на видео, чтобы иметь возможность отключить его, потому что я думаю, что любой браузер не покажет его, если не сможет его найти, и когда я открыл ссылку на видео на YouTube, он показывался как «blob: https://www.youtube.com/e5c4808e-297e-451f-80da-3e838caa1275"без кавычек, поэтому он шифрует его, чтобы его нельзя было сохранить ... вам нужно знать php для этого, но, как и ответ, который вы выбрали, чтобы сделать его сложнее, youtube делает его самым сложным из тяжелых шифрований, вы должны быть продвинутый программист php, но если вы не знаете этого, то возьмите человека, которого вы выбрали, как лучший ответ, который затруднит его загрузку ... но если вы знаете php, чем зашифрованный, зашифруйте ссылку на видео, чтобы ее можно было только прочитать ваш ... я не знаю, как объяснить, как они это делают, но они сделали, и есть способ. Способ, которым YouTube шифрует видео, довольно умный, так что если вы хотите узнать, как это сделать, просто спросите youtube / google о том, как они делают это ... надеюсь, это поможет вам, хотя вы уже выбрали лучший ответ. Так что шифрование ссылки лучше всего в короткие сроки.

Джонатан Дж. Пекани
источник
0

Кажется, что потоковое видео через websocket является жизнеспособным вариантом, как в случае потоковых кадров и их рисования на холсте.

Потоковое видео через веб-сокеты с использованием JavaScript

Я думаю, что это обеспечило бы другой уровень защиты, затруднивший получение клиентом видео и, конечно, решение вашей проблемы с помощью контекстного меню правой кнопкой мыши «Сохранить видео как ...» (перебор?!).

парень
источник
0

Вот что я сделал:

function noRightClick() {
      alert("You cannot save this video for copyright reasons. Sorry about that.");
}
    <body oncontextmenu="noRightClick();">
    <video>
    <source src="http://calumchilds.com/videos/big_buck_bunny.mp4" type="video/mp4">
    </video>
    </body>
Это также работает для изображений, текста и почти всего. Тем не менее, вы все равно можете получить доступ к «Проверка» и «Просмотр источника» с помощью сочетаний клавиш. (Как сказано в ответе сверху, вы не можете полностью это остановить.) Но вы можете попытаться установить барьеры, чтобы остановить их.

Калум Чайлдс
источник
-1

У @ Clayton-Graul было то, что я искал, за исключением того, что мне нужна была версия CoffeeScript для сайта, использующего AngularJS. На тот случай, если вам это тоже понадобится, вот что вы вставили в рассматриваемый контроллер AngularJS:

    # This is how to we do JQuery ready() dom stuff
    $ ->
        # let's hide those annoying download video options.
        # of course anyone who knows how can still download
        # the video, but hey... more power to 'em.
        $('#my-video').bind 'contextmenu', -> 
            false

"странные вещи в круге k" (это правда)

Райан Крюс
источник