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

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

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

28 ответов

Решение

На самом деле, вы не можете. Но вы можете усложнить загрузку.


Браузеры делают захват слишком простым

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

Подготовьте вкладку сети вашего любимого отладчика браузера и дайте видео загрузиться. Затем поищите его в загруженных ресурсах. Видео обычно передается в формате.flv или.mp4, а аудио - в формате.mp3. Когда вы определите URL, откройте новую вкладку / окно и откройте ссылку там. Браузер загрузит файл.


Делать это сложнее

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

Видео в технике холста

Недавно я натолкнулся на эту статью из HTML5Doctor, исследуя обнаружение движения в JS. Это включает в себя потоковое видео через <video>затем с помощью JS скопируйте видео в <canvas>, Вот пример, где видео находится на первом плане, а полотно на заднем плане снабжается данными из того же видео.

По сути, то, что вы делаете, это:

  • Предопределите HTML или вставьте динамически <canvas> в ДОМ. Это тот "игрок", который видит пользователь.
  • Динамически создайте видео-тег через JS, добавьте его в скрытый DOM и присвойте ему URL для потоковой передачи. Это будет источником видео для холста.
  • Затем с помощью JS вы периодически получаете данные из <video> Вы только что создали и нарисуйте его на <canvas>, На этом этапе видео попадает на холст.

Это самая основная часть всей рутины. Поскольку ваш проигрыватель теперь является канвой, а настоящее видео скрыто, вы можете попробовать щелкнуть правой кнопкой мыши все, что вы хотите, и сохранить. Поскольку холст действует как изображение на странице, вы можете сохранить только кадр, который был отображен на холсте. Что касается элементов управления, JS имеет API для управления<video> так что вы можете создавать собственные кнопки и ползунки.

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

URL-адреса временных ресурсов

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

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

//we load some video with id 1234324 from your site using this url
//and the token generated on page load is appended as sid

http://yoursite.com/media.php?video_id=1234324&sid=a0s9d8a98a0d98asd09809wq0e9

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

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

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

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

$(document).ready(function(){
   $('#videoElementID').bind('contextmenu',function() { return false; });
});

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


  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-холста) и никогда не связывайтесь с видео напрямую. Чтобы просто удалить контекстное меню, добавьте в ваш HTML:

    <body oncontextmenu="return false;">
    


Результат:

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

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


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

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

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

ВЫ НЕ МОЖЕТЕ

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

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

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

 <body oncontextmenu="return false;">

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

ДА ВЫ МОЖЕТЕ:

Как разработчик на стороне клиента, я рекомендую использовать 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();
}

Вы можете использовать

<video src="..." ... controlsList="nodownload">

https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/controlsList

Это не препятствует сохранению видео, но удаляет кнопку загрузки и опцию "Сохранить как" в контекстном меню.

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 восстанавливает имя файла; удаляет сеанс и мгновенно отправляет видео. Кроме того, должны присутствовать все заголовки "no cache" и mime-type.

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 в новой вкладке или воспользуется контекстным меню, ему не повезет.

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

<video oncontextmenu="return false;"  controls>
  <source src="https://yoursite.com/yourvideo.mp4" >
</video>

В итоге мы использовали 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>';

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

oncontextmenu="return false;"

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

<video oncontextmenu="return false;" controls>...</video>

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

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

Вы также должны знать, что <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>

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

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

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

отказ от ответственности

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

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

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

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

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

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

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

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

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

вот как 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);
            }
        });
    }

});

в любом случае, пользователь может обойти это, используя некоторый метод загрузки, который загружает файл посредством потоковой передачи. почти С # делает это из коробки, а для 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 лет назад. Поскольку я написал его только для учебных целей и личного использования, репозиторий пока не получил никаких обновлений, и я не собираюсь обновлять или упрощать работу с ним. это просто пример того, как это можно сделать.

<body oncontextmenu="return false;"> 

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

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

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

Вот полное решение для отключения загрузки, включая щелчок правой кнопкой мыши> Сохранить как ... в контекстном меню:

      <video oncontextmenu="return false;" controlsList="nodownload">
</video>

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

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>
Это также работает для изображений, текста и почти всего. Тем не менее, вы можете получить доступ к инструментам "Проверка" и "Просмотр источника" с помощью сочетаний клавиш. (Как сказано в ответе сверху, вы не можете полностью это остановить.) Но вы можете попытаться установить барьеры, чтобы остановить их.

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

      <video src="" controls controlsList="nodownload"></video>

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

         <video width="400"  controlsList="nofullscreen nodownload"  controls>

Краткий ответ: зашифруйте ссылку, как это делает 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 о том, как они это делают... надеюсь, это поможет вам, хотя вы уже выбрали лучший ответ. Так что шифрование ссылки лучше всего в короткие сроки.

Вы не можете.

Например, люди могут использовать некоторый API, например desktopCapture , getUserMedia, который позволяет пользователям записывать экран, окно, вкладку .

Люди могут использовать его и записывать на холст, а затем объединять все фрагменты вместе, чтобы получить видео,

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

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

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

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

Я нашел хороший ответ на аналогичную проблему, используя PHP вместо JavaScript для большей безопасности.

Я хочу воспроизвести test.mp4 в браузере пользователя, используя проигрыватель браузера по умолчанию (так же, как если бы URL/test.mp4 был щелкнут на веб-странице), но требуя пароля, который предоставляется либо пользователем, либо внутренним программным обеспечением. .

Вот краткий набросок идеи. Все начинается с того, что пользователь запускается (запускает) программу, которую я написал, под названием secure.php, чтобы воспроизвести test.mp4.

Файл test.mp4 находится в подкаталоге ("secureSubdirectory"), который содержит .htaccess, содержащий "Require all disabled". Это немедленно предотвращает любой прямой доступ через URL.

Когда запускается secure.php, он предоставляет пароль (или запрашивает пароль у пользователя), затем выполняет POST для себя, который включает пароль, проверяет его с помощью соли, используя команды PHP:

      $Hash=base64_encode(hash_hmac("sha256",$Pwd,$Salt,true));
$HashesAreSame=hash_equals($Hash,$GoalHash);

затем проверяет наличие файла test.mp4 и выполняет следующий код PHP, чтобы вернуть файл test.mp4 в виде потока байтов в браузер пользователя:

      header("Content-Type: video/mp4");
echo file_get_contents("secureSubdirectory/$path");
exit;

Видео показывает, как и ожидалось. Если я затем щелкну правой кнопкой мыши страницу, показывающую видео, и попытаюсь сохранить видео, полученный файл будет просто содержать строку ошибки, например «Ошибка: пароль не найден», поскольку test.mp4 запрашивается с использованием простого secure.php URL, а не через POST с правильным паролем.

Конечно, вы можете получить полезную нагрузку ответа (байты видео), используя параметр «Сеть» инструментов отладки браузера, но это может быть предотвращено программой PHP или файлом .htaccess, если браузер предоставляет возможность запретить доступ к отладке. инструменты.

Я не могу представить случай сбоя, но мне было бы очень интересно, если бы он существовал, так как простая, но идеальная авторизация — это большая редкость. (Обратите внимание, поскольку этот метод основан на пароле, связывание его с пользователем не является безопасным способом аутентификации, поскольку пользователь может случайно или преднамеренно опубликовать или поделиться паролем.)

Если вы ищете полное решение / плагин, я нашел этот очень полезным https://github.com/mediaelement/mediaelement

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

      <video  type="video/mp4" width="330" height="300" controlsList="nodownload" oncontextmenu="return false;" controls></video>

У @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" (это правда)

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

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

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

Другие вопросы по тегам