Запобігти завантаженню відео HTML5 (збережена правою кнопкою миші)?


171

Як я можу відключити "Зберегти відео як ..." у меню правої кнопки браузера, щоб клієнти не завантажували відео?

Чи є більш повні рішення, які не дають клієнту доступу безпосередньо до шляху файлу?


3
Я підняв голосування за це питання, оскільки воно лише абсолютно запитує, як "відключити клацання правою кнопкою миші" для відео HTML5. Я не впевнений, чи це схоже на вимкнення правою кнопкою миші для звичайних зображень чи є інші трюки з накладанням тощо, які можна застосувати.

3
Навіть якщо ви відключите клацання правою кнопкою миші, вони все одно можуть зберегти її з меню браузера ( File→Save As). Навіть якщо ви могли якось заблокувати це, вони можуть переглядати-джерело, щоб знайти URL-адресу файлу. Навіть якщо ви могли трохи затьмарити це, вони можуть вирвати його з кеша. Навіть якщо ви могли б ускладнити це (наприклад, потік), вони можуть захоплювати мережевий трафік нюхачем або чимось іншим. Справа в тому, що якщо надіслати його користувачеві, він може зберегти його. Нічого не обійтися. Питання, яке вам потрібно задати, це чому вам потрібно так погано зупинити. Чи насправді навіть це потрібно? Чи варто докладати зусиль та непривітності до користувачів?
Synetech

Мені подобається, що TxRegex найкраще відповідає як швидке базове рішення.
jsherk

Я збираюся виглядати тут педантично, але ви перевантажуєте термін "скачати". Ви, звичайно , хочете дозволити завантаження відео.
Йохан Буле

Відповіді:


226

Ви не можете . Це тому, що саме так розробили браузери: Подавати вміст . Але ви можете зробити це важче завантажити .

По-перше, ви можете відключити contextmenuподію , яка називається "клацанням правою кнопкою миші". Це не дозволить вашому звичайному скайду відверто зірвати ваше відео, клацнувши правою кнопкою миші та Зберегти як. Але тоді вони могли просто відключити JS і обійти це або знайти джерело відео через налагоджувач браузера. Плюс це поганий UX. У контекстному меню є багато законних речей, ніж просто Зберегти як.

Ви також можете використовувати власні бібліотеки відеоплеєра. Більшість із них реалізують відеоплеєри, які налаштовують контекстне меню на ваш смак. Отже, ви не отримаєте контекстне меню браузера за замовчуванням. І якщо вони коли-небудь обслуговуватимуть пункт меню, схожий на Зберегти як, ви можете його відключити. Але знову ж таки, це рішення JS. Слабкі місця схожі на попередній варіант.

Ще один спосіб зробити це - подавати відео за допомогою потокової трансляції HTTP . По суті, це порізати відео на шматки і подавати його один за одним. Ось як більшість потокових сайтів обслуговують відео. Тож навіть якщо вам вдасться зберегти як, ви зберігаєте лише шматок, а не все відео. Знадобиться трохи більше зусиль, щоб зібрати всі шматки та зшити їх за допомогою спеціального програмного забезпечення.

Інший метод полягає в фарба <video>на<canvas> . У цій техніці, з трохи JavaScript, те, що ви бачите на сторінці, є <canvas>елементом візуалізації кадрів із прихованого <video>. А оскільки це a <canvas>, контекстне меню використовуватиме <img>меню s, а не <video>s. Ви отримаєте Зберегти зображення як замість Зберегти відео як.

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

Зрештою, я просто завантажую своє відео на сторонній відео-сайт, наприклад YouTube чи Vimeo. Вони мають хороші інструменти для управління відео, оптимізують відтворення на пристрої, і вони докладають зусиль, щоб запобігти їхньому зірванню відео з нульовими зусиллями.


1
дякую за детальну відповідь, чи можна принаймні відключити збереження як параметр з меню правої кнопки миші? він охоплюватиме основні випадки знань
пітон

2
це залежить від браузера. Я бачив рази (особливо Firefox та Chrome), що якщо відео завантажується повністю, коли ви натискаєте "Зберегти", вони просто вибирають відео з кеша, а не повторно завантажують (це відео вже завантажено в кеш, чому його завантажувати знову?), отже, другого запиту немає. вищевказаний метод застосований лише тоді, коли посилання повторно використовується.
Йосип

1
ну, я знайшов статтю, яка розповідає про накладання відеотегів на діву. оновив мою відповідь
Йосип

2
Дякую. Я просто читаю craftymind.com/factory/html5video/CanvasVideo.html . Ідея майже така ж, як і ваша відповідь.
Трунг

1
@Cupidvogel "URL-адреса одноразового використання" - це кінцева точка сервера, яка приймає маркер, створений сервером. Маркер генерується при генерації сторінки та зберігається у db. Він також поставляється зі сторінкою , як srcз <video>. До моменту завантаження сторінки, db має маркер, сторінка має маркер. Після того, як він <video>починає завантажуватися (отримує доступ до кінцевої точки), сервер перевіряє, чи є маркер у db, видаляє його та передає файл. Якщо маркер відсутній у результаті другого доступу , не завантажуйте файл.
Йосип

118

Це просте рішення для бажаючих просто видалити правою кнопкою миші опцію «зберегти» з відео html5

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

Це фантастично! Це чудово справляється із запобіганням завантаження відео звичайним людям!
Etienne Noël

2
Однак це не допоможе, якщо JavaScript відключений у браузері.
mvark

2
Дякуємо, це рішення достатньо для 90% усіх наших відвідувачів.
Кай Ноак

2
Bleh. Просто огляньте елемент у Firebug, подивіться srcатрибут та відкрийте його на іншій вкладці або використовуйте wgetдля завантаження!
SexyBeast

11
Я думаю, що головна мета цього - уникнути "нормальних" користувачів для завантаження відео. Це вдале рішення для вирішення цієї ситуації.
Унапедра

37

Проста відповідь,

НЕ МОЖЕТЕ

Якщо вони переглядають ваше відео, вони вже мають його

Ви можете уповільнити їх, але не можете їх зупинити.


До речі, ця відповідь стосується відео HTML5, флеш-відео чи будь-якої технології, яку ви можете уявити у майбутньому. Це просто: це як працює.
Густаво Родрігес

А що з ютубом ?, на youtube ви не можете легко відкрити відеофайл. Я маю на увазі, що добре, ви маєте рацію, ми можемо, але легко сховати джерело mp4 на youtube або подібний відеохостинг, ніж розмістити простий mp4 на нашому сервері та використовувати програвач html5.
dlopezgonzalez

2
Це не відповідь на жодне з питань.
Цшанд

1
Люди могли записати весь екран та аудіо та обдурити всі обходи, тому їх можна лише уповільнити.
kintsukuroi

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

    <body oncontextmenu="return false;">


Результат:

www.foo.com/player.html буде правильно відтворювати відео , але якщо ви відвідаєте www.foo.com/videos/video.mp4:

Код помилки 403: ЗАБОРОНЕНО


Це буде працювати для прямого завантаження, CURL, гарячої посилання, ви називаєте це.

Це повна відповідь на два задані питання, а не відповідь на запитання: "чи можу я зупинити користувач у завантаженні вже завантаженого відео".


1
Чудова відповідь, але у вас є `що ви повинні видалити його зі свого .htaccessвмісту
MAZux

2
Ви все одно можете підробити HTTP Referer, що дозволить завантажувати людину. Однак це дуже розумне рішення. Якщо ви поєднали це з одноразовим кодом у файлі, ви готові йти!
Широй

Здається, все ще IDM може завантажити його!
PersianMan

@PersianMan Правильно - закликаю вас прочитати перші відповіді
Цшанд

1
Якщо ви вимкнете javascript у браузері, цей трюк не працюватиме, оскільки після цього натискається клацання правою кнопкою миші. Щоб уникнути цього також, ви повинні динамічно отримувати та завантажувати відео елемент, використовуючи jquery.
Anindya Sankar Dasgupta

23

Найкращий спосіб, який я зазвичай використовую, дуже простий, я повністю відключаю контекстне меню на всій сторінці, чистий html + javascript:

 <body oncontextmenu="return false;">

Це воно! Я роблю це, тому що ви завжди можете побачити джерело клацанням правою кнопкою миші.
Гаразд, ви кажете: "Я можу безпосередньо використовувати джерело перегляду браузера", і це правда, але ми починаємо з того, що ви НЕ можете припинити завантажувати html5відео.


Я думаю, що solución повинен бути таким, який не заважає "нормальним" користувачам, відключення клацання правою кнопкою миші заважатиме користувачам копіювати та вставляти текст, або шукати слово, в яке вони перетинаються, наприклад, під заголовком відео, звичайно, ні всі користувачі, ймовірно, це зроблять, але для деяких з них це може бути неприємно
Джон Балвін Аріас

14

Як розробник на стороні клієнта я рекомендую використовувати URL-адресу blob, URL-адреса blob - це URL-адреса на стороні клієнта, яка посилається на бінарний об'єкт

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

в HTML залиште ваше відео srcпорожнім, а в JS витягніть відеофайл за допомогою AJAX, переконайтесь, що тип відповіді крапковий

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();
}

Примітка. Цей метод не рекомендується для великих файлів

EDIT

  • Використовуйте блокування перехресного походження, щоб уникнути прямого завантаження

  • якщо відео передається за допомогою API, використовуйте інший метод (PUT / POST) замість "GET"


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


Мені подобається рішення - воно вирішує питання ОП. Прикра, що перевіряє вихідний код у Chrome і клацає правою кнопкою миші на посилання. Користувач завантажить файл html, який фактично буде відеофайлом.
користувач1252280

5

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

oncontextmenu="return false;"

Це працює для елемента тіла (ціла сторінка) або просто одного відео, використовуючи його всередині відеотега.

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

5

Ми закінчилися з використанням AWS CloudFront із закінчуючими URL-адресами. Відео завантажується, але до того часу, коли користувач натисне правою кнопкою миші та вибере "Зберегти як", URL-адреса відео, яку вони отримали, минула. Здійсніть пошук ідентифікатора доступу CloudFront Origin.

Для створення URL-адреси відео потрібна пара ключів, яку можна створити в AWS CLI. FYI, це не мій код, але він чудово працює!

$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>';

1
Високо занижений коментар. Я б радив використовувати docs.aws.amazon.com/sdk-for-php/v3/developer-guide/…, проте сьогодні.
Змарт

Якщо маркер закінчується, чи означає це, що вони також не можуть орієнтуватися навколо відео? Оскільки це, здається, знову зв'язатися з URL-адресою відео.
Chud37

4

Ми могли б зробити це не так просто, сховавши контекстне меню, наприклад, таке:

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

3

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


2
чому пік знадобиться час для завантаження, тому поставте лише тег div, і вони отримають велике меню з хрому, як перезавантаження назад тощо
Waqas Tahir

Я не впевнений, але все-таки відео можна завантажити через Файл> SaveAs
Арун Кумар

3

The

<body oncontextmenu="return false;"> 

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


2

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


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-адресу на очах після встановлення сценарію.
Симона,

@Simone Я згоден, однак це краще, ніж показувати його безпосередньо в html-джерелі, де кожен, хто клацне правою кнопкою миші, може побачити це негайно. Ви завжди можете розділити URL або зашифрувати його. Але пам’ятайте, що це додаткова обробка
Саймон

"CSS не можна вимкнути в браузері" - Технічно ви можете змінити CSS в інструментах для розробників веб-браузерів, щоб відключити певні правила CSS, щоб більш досконала людина могла видалитиpointer-events: none;
Phil Gibbins

2

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

Окрім інших згаданих методів відключення контекстного меню. Користувач все ще може використовувати сторонні інструменти, такі як InternetDownload Manager або інше подібне програмне забезпечення для завантаження відео. метод захисту, який я тут пояснюю, - це пом’якшити ці програмні продукти сторонніх виробників.

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

відмова від відповідальності

Я не беру на себе ніякої відповідальності, якщо хтось зловживає цими методами або використовує їх для шкоди іншим або веб-сайтам, які я згадав як приклад. це просто обмін знаннями, щоб допомогти вам захистити свій інтелектуальний продукт.

генерувати зв’язки із закінченням терміну дії

вимога до цього полягає у створенні посилання для завантаження на кожного користувача. з цим можна легко впоратися із зберіганням блакитного блобу або amazon s3. ви можете створити посилання для завантаження з подвійною часовою міткою тривалості відео. то вам потрібно зафіксувати це відеопосилання та час, який вимагається. це необхідно для наступного методу. Привід цього методу полягає в тому, що ви створюєте посилання для завантаження, коли користувач натискає кнопку відтворення.

при події кнопки відтворення ви надішлете запит на сервер і отримаєте посилання та оновите джерело.

зменшити швидкість запиту на відео

то ви відстежуєте, наскільки швидко запит користувача на друге відео. якщо користувач запитує посилання на завантаження занадто швидко, то ви їх відразу блокуєте. ви не можете встановити цей поріг занадто великим, оскільки ви можете помилково заблокувати користувачів, які просто переглядають або сканують відео.

Увімкнути діапазон HTTP

для відтворення відео використовуйте деяку бібліотеку js, як videojs , також вам потрібно повернути AcceptRange у своєму заголовку. Зберігання блошів Azure підтримує це нестандартно. таким чином браузер починає завантажувати відеоролик за допомогою чанку. зазвичай 32 байт на 32 байт. то вам потрібно прослухати timeupdateзміну відео-відео та оновити ваш сервер про відсоток перегляду відео. відсоток перегляду відео не може бути більшим, ніж відсоток доставки відео. і якщо ви доставляєте відеовміст, не отримуючи жодної відсоткової зміни, ви можете заблокувати користувача. тому що точно вони завантажують.

реалізація цього є складним, оскільки користувач може пропускати відео вперед або назад, тому будьте в курсі цього, коли ви реалізуєте це.

ось так обробляє 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-адресі сторінки завантаження при завантаженні відео.

Обчисліть час між запитом

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

Щоб вирішити це, користувач може помістити випадковий час сну між запитами.

зразок коду

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



1

Короткий відповідь: Зашифруйте посилання, як це робить YouTube, не знаєте як, ніж запитайте у youtube / google, як вони це роблять. (Про всяк випадок, якщо ви хочете потрапити прямо в точку.)

Я хотів би зазначити будь-кому, що це можливо, тому що youtube робить це, і якщо вони можуть так, може будь-який інший веб-сайт, і це не від браузера, тому що я перевірив його на кількох браузерах, таких як Microsoft edge і Internet Explorer і тож є спосіб відключити це і побачив, що люди все-таки говорять це ... Я намагаюся шукати відповідь, тому що якщо youtube може, то повинен бути спосіб, і єдиний спосіб побачити, як це зробити, якщо хтось заглянув у сценарії ютуба, якими я зараз займаюся. Я також перевірив, чи не було це спеціальне контекстне меню, і це не тому, що контекстне меню перебігає елемент перевірки, і я маю на увазі, як це над ним, і я подивився, і він ніколи не створює новий клас, а також це Неможливо насправді отримати доступ до інспектуючого елемента за допомогою JavaScript, тому цього не може бути. Ви можете сказати, коли двічі клацніть правою кнопкою миші на відео YouTube, що воно спливає контекстне меню для хромування. Крім того ... youtube не додав би цю функцію. Я займаюся дослідженнями і переглядаю джерело youtube, тому я повернусь, якщо знайду відповідь ... якщо хтось скаже, що ви не можете, ну, хіба що ' не робити такі дослідження, як у мене. Єдиний спосіб завантажувати відео на YouTube - це завантаження відео.

Гаразд ... Я зробив дослідження, і моє дослідження залишається, що ви можете його відключити, за винятком того, що у ньому немає JavaScript ... ви повинні мати можливість зашифрувати посилання на відео, щоб ви могли відключити його, тому що я думаю, що веб-переглядач не показуватиме його, якщо він не може його знайти, і коли я відкрив відеопосилання YouTube, воно показало, як цей "крап: https://www.youtube.com/e5c4808e-297e-451f-80da-3e838caa1275"без лапок, тому це зашифровує його, тому його неможливо зберегти ... вам потрібно знати php для цього, але, як відповідь, яку ви вибрали, що ускладнює, youtube робить це найважче за важке шифрування, вам потрібно бути заздалегідь програміст PHP, але якщо ви цього не знаєте, ніж прийміть обрану людину як найкращу відповідь, що ускладнює її завантаження ... але якщо ви знаєте, що php важко зашифрувати відео посилання, тож його можна прочитати тільки на твій ... Я не знаю, як пояснити, як вони це роблять, але вони так і зробили. Спосіб youtube шифрує там відео досить розумний, тому якщо ви хочете знати, як просто запитати в youtube / google про те, як вони це роблять ... сподіваюся, що це допоможе вам, хоча ви вже вибрали найкращу відповідь. Тож шифрування посилання найкраще за короткий термін.


0

Схоже, передача відео через веб-сокет - це життєздатний варіант, як в потоковому кадрі і малювати їх на полотні, як-небудь річ.

Потокове відео через веб-сокети за допомогою 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

@ У Клейтона-Грауля було те, що я шукав, за винятком того, що мені потрібна версія 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" (це правда)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.