Zablokować pobieranie wideo HTML5 (zapisano prawym przyciskiem myszy)?


171

Jak wyłączyć opcję „Zapisz wideo jako ...” w menu przeglądarki wyświetlanym po kliknięciu prawym przyciskiem myszy, aby uniemożliwić klientom pobieranie wideo?

Czy istnieją bardziej kompletne rozwiązania, które uniemożliwiają klientowi bezpośredni dostęp do ścieżki pliku?


3
Głosowałem w górę na to pytanie, ponieważ absolutnie prosi tylko o to, jak „wyłączyć kliknięcie prawym przyciskiem myszy” dla wideo HTML5. Nie jestem pewien, czy jest to podobne do wyłączania prawym przyciskiem myszy dla normalnych obrazów, czy też istnieją inne sztuczki nakładania itp., Które można zastosować.

3
Nawet jeśli wyłączysz kliknięcie prawym przyciskiem myszy, nadal mogą go zapisać z menu przeglądarki ( File→Save As). Nawet jeśli możesz to w jakiś sposób zablokować, mogą przeglądać źródło, aby znaleźć adres URL pliku. Nawet jeśli możesz to trochę ukryć, mogą wyrwać to z pamięci podręcznej. Nawet jeśli możesz to skomplikować (np. Streamowanie), mogą przechwycić ruch sieciowy za pomocą sniffera lub czegoś podobnego. Faktem jest, że jeśli wyślesz go do użytkownika, może go zapisać. Nie da się tego obejść. Pytanie, które musisz zadać, brzmi, dlaczego musisz tak bardzo to zatrzymać. Czy to naprawdę jest konieczne? Czy jest to warte wysiłku i nieprzyjazne dla użytkownika?
Synetech

Najbardziej podoba mi się odpowiedź TxRegex jako szybkie podstawowe rozwiązanie.
jsherk

Mam zamiar wyglądać tutaj pedantycznie, ale przeładowujesz termin „pobieranie”. Oczywiście chcesz zezwolić na pobranie wideo.
Johan Boulé,

Odpowiedzi:


226

Nie możesz . Dzieje się tak, ponieważ do tego celu zostały zaprojektowane przeglądarki: do obsługi treści . Ale możesz utrudnić pobieranie .

Po pierwsze, ty mogłoby wyłączyć contextmenuzdarzenie , alias „prawo kliknięcie”. Zapobiegnie to rażącemu zgrywaniu twojego wideo przez zwykłe skiddie, klikając prawym przyciskiem myszy i Zapisz jako. Ale wtedy mogliby po prostu wyłączyć JS i obejść ten problem lub znaleźć źródło wideo za pomocą debugera przeglądarki. Poza tym to zły UX. W menu kontekstowym jest wiele prawdziwych rzeczy niż tylko Zapisz jako.

Możesz także użyć niestandardowych bibliotek odtwarzaczy wideo. Większość z nich implementuje odtwarzacze wideo, które dostosowują menu kontekstowe do własnych upodobań. Więc nie dostajesz domyślnego menu kontekstowego przeglądarki. A jeśli kiedykolwiek wyświetlą pozycję menu podobną do opcji Zapisz jako, możesz ją wyłączyć. Ale znowu, jest to obejście JS. Słabe strony są podobne do poprzedniej opcji.

Innym sposobem jest wyświetlenie wideo przy użyciu przesyłania strumieniowego HTTP na żywo . Zasadniczo polega na pocięciu wideo na kawałki i wyświetleniu go jeden po drugim. W ten sposób większość witryn do przesyłania strumieniowego obsługuje wideo. Więc nawet jeśli uda ci się zapisać jako, zapisujesz tylko fragment, a nie cały film. Zebranie wszystkich fragmentów i zszycie ich za pomocą specjalnego oprogramowania wymagałoby nieco więcej wysiłku.

Inną techniką jest pomalować <video>na<canvas> . W tej technice, z odrobiną JavaScript, widzisz na stronie <canvas>element renderujący ramki z ukrytego <video>. A ponieważ jest to <canvas>, menu kontekstowe użyje <img>menu a, a nie<video> '. Otrzymasz Zapisz obraz jako zamiast Zapisz wideo jako.

Możesz również użyć tokenów CSRF na swoją korzyść. Twój serwer wyśle ​​token na stronę. Następnie używasz tego tokena, aby pobrać wideo. Twój serwer sprawdza, czy jest to prawidłowy token, zanim wyświetli wideo, lub pobierze HTTP 401 . Chodzi o to, że wideo można uzyskać tylko za pomocą tokena, który można uzyskać tylko wtedy, gdy przeszedłeś ze strony, a nie bezpośrednio odwiedzając URL wideo.

Pod koniec dnia po prostu przesyłałem swój film do witryny wideo innej firmy, takiej jak YouTube lub Vimeo. Mają dobre narzędzia do zarządzania wideo, optymalizują odtwarzanie na urządzeniu i dokładają wszelkich starań, aby zapobiec zgrywaniu filmów bez żadnego wysiłku z Twojej strony.


1
dziękuję za szczegółową odpowiedź, czy można przynajmniej wyłączyć opcję zapisz jako z menu prawego przycisku myszy? obejmie większość podstawowych przypadków wiedzy
python

2
to zależy od przeglądarki. Widziałem razy (szczególnie Firefox i Chrome), że jeśli wideo jest w pełni załadowane, kiedy klikniesz „zapisz”, po prostu wybierają wideo z pamięci podręcznej zamiast ponownego pobierania (wideo jest już pobrane w pamięci podręcznej, po co je pobierać ponownie?), więc nie ma drugiego żądania. powyższa metoda ma zastosowanie tylko w przypadku ponownego wykorzystania linku.
Joseph

1
cóż, znalazłem artykuł mówiący o nakładaniu tagu wideo na element div. zaktualizowałem moją odpowiedź
Joseph

2
Dzięki. Właśnie przeczytałem craftymind.com/factory/html5video/CanvasVideo.html . Pomysł jest prawie taki sam, jak twoja odpowiedź.
Trung

1
@Cupidvogel „URL jednorazowego użytku” to punkt końcowy serwera, który akceptuje token wygenerowany przez serwer. Token jest generowany podczas generowania strony i zapisywany w bazie danych. Jest również dostarczany ze stroną srcz <video>. Do czasu załadowania strony baza danych ma token, a strona ma token. Po <video>rozpoczęciu ładowania (uzyskuje dostęp do punktu końcowego), serwer sprawdza, czy token znajduje się w bazie danych, usuwa go i przesyła strumieniowo plik. Jeśli token nie istnieje w wyniku drugiego dostępu , nie przesyłaj strumieniowo pliku.
Joseph

118

Jest to proste rozwiązanie dla tych, którzy chcą po prostu usunąć opcję „zapisz” prawym przyciskiem myszy z filmów HTML5

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

To jest fantastyczne ! Wykonuje świetną robotę, uniemożliwiając zwykłym ludziom pobieranie wideo!
Etienne Noël

2
Nie pomaga to jednak, jeśli JavaScript jest wyłączony w przeglądarce.
mvark

2
Dzięki temu rozwiązanie jest wystarczające dla 90% wszystkich naszych gości.
Kai Noack

2
Bleh. Po prostu sprawdź element w Firebug, zobacz srcatrybut i otwórz go w innej karcie lub użyj, wgetaby go pobrać!
SexyBeast

11
Myślę, że głównym celem tego jest uniknięcie pobierania wideo przez „zwykłych” użytkowników. To dobre rozwiązanie tej sytuacji.
Unapedra

37

Prosta odpowiedź,

NIE MOŻESZ

Jeśli oglądają Twój film, to już go mają

Możesz je spowolnić, ale nie możesz ich powstrzymać.


Nawiasem mówiąc, ta odpowiedź dotyczy filmów HTML5, filmów flash lub dowolnej technologii, jaką możesz sobie wyobrazić w przyszłości. To proste: tak to działa.
Gustavo Rodrigues

A co z youtube ?, na youtube nie można łatwo odkryć pliku wideo. Chodzi mi o to, że ok, masz rację, możemy, ale łatwo jest ukryć źródło mp4 na youtube lub podobnym hostingu wideo, niż hostować prosty mp4 na naszym serwerze i użyć odtwarzacza html5.
dlopezgonzalez

2
To nie jest odpowiedź na żadne z pytań.
Tzshand

1
Ludzie mogli nagrywać cały ekran i dźwięk i oszukiwać wszystkie obejścia, dlatego można je tylko spowolnić.
kintsukuroi

1
@IlanSchemoul Interesting. Dzięki za udostępnienie :)
Starx

33

Tak, możesz to zrobić w trzech krokach:


  1. Umieść pliki, które chcesz chronić, w podkatalogu katalogu, w którym działa Twój kod.

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

  2. Zapisz plik w tym podkatalogu o nazwie „.htaccess” i dodaj poniższe wiersze.

    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]

Teraz łącze źródłowe jest bezużyteczne , ale nadal musimy się upewnić, że żaden użytkownik próbujący pobrać plik nie może bezpośrednio udostępnić pliku.

  1. Aby uzyskać pełniejsze rozwiązanie , wyświetlaj teraz wideo za pomocą odtwarzacza flash (lub płótna html) i nigdy nie łącz bezpośrednio z wideo. Aby po prostu usunąć menu prawego przycisku myszy, dodaj do kodu HTML:

    <body oncontextmenu="return false;">


Wynik:

Witryna www.foo.com/player.html będzie poprawnie odtwarzać wideo , ale jeśli odwiedzisz www.foo.com/videos/video.mp4:

Kod błędu 403: ZABRONIONE


To zadziała w przypadku bezpośredniego pobierania, cURL, hotlinkowania, możesz to nazwać.

To jest pełna odpowiedź na dwa zadane pytania, a nie odpowiedź na pytanie: „czy mogę uniemożliwić użytkownikowi pobieranie pliku wideo, który już pobrał”.


1
Świetna odpowiedź, ale masz `` że powinieneś ją usunąć ze swoich .htaccesstreści
MAZux

2
Nadal możesz sfałszować stronę odsyłającą HTTP, która pozwoli osobie na pobranie. Jest to jednak bardzo sprytne rozwiązanie. Jeśli dołączysz do tego jednorazowy kod w pliku, jesteś gotowy!
Shiroy

Wygląda na to, że IDM nadal może go pobrać!
PersianMan

@PersianMan Correct - Zachęcam do przeczytania pierwszych odpowiedzi
Tzshand

1
Jeśli wyłączysz javascript w przeglądarce, ta sztuczka nie zadziała, ponieważ wtedy prawe kliknięcie zostanie włączone. Aby tego również uniknąć, należy dynamicznie pobierać i wczytywać element wideo za pomocą jquery.
Anindya Sankar Dasgupta

23

Najlepszy sposób, z którego zwykle korzystam, jest bardzo prosty, całkowicie wyłączam menu kontekstowe na całej stronie, czysty html + javascript:

 <body oncontextmenu="return false;">

Otóż ​​to! Robię to, ponieważ zawsze możesz zobaczyć źródło, klikając prawym przyciskiem myszy.
Ok, mówisz: „Mogę używać bezpośrednio źródła widoku przeglądarki” i to prawda, ale zaczynamy od tego, że NIE MOŻESZ przestać pobierać html5filmów.


Myślę, że rozwiązanie musi być takie, które nie przeszkadza „zwykłym” użytkownikom, wyłączenie prawego przycisku myszy uniemożliwi użytkownikom kopiowanie i wklejanie jakiegoś tekstu lub wyszukiwanie słowa, w którym są wtrąceni, na przykład w tytule filmu, oczywiście nie wszyscy użytkownicy prawdopodobnie to zrobią, ale dla niektórych może to być irytujące
John Balvin Arias,

14

Jako programista po stronie klienta zalecam użycie adresu URL obiektu blob, adres URL obiektu blob to adres URL po stronie klienta, który odnosi się do obiektu binarnego

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

w HTML pozostaw wideo srcpuste, aw JS pobierz plik wideo za pomocą AJAX, upewnij się, że typ odpowiedzi to 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();
}

Uwaga: ta metoda nie jest zalecana w przypadku dużych plików

EDYTOWAĆ

  • Użyj blokowania między źródłami, aby uniknąć bezpośredniego pobierania

  • jeśli wideo jest dostarczane przez interfejs API Użyj innej metody (PUT / POST) zamiast „GET”


3
YouTube używa Bloba teraz też myślę :)?
C0nw0nk

1
Czy możesz dokładniej wyjaśnić, co się tutaj dzieje i jak skonfigurować serwer do tego?
Anthony

1
@nerdofcode jak to się zachowuje, gdy użytkownicy próbują przekazać wideo dalej? Czy będą musieli czekać, aż wszystkie pliki wideo zostaną pobrane?
John Balvin Arias,

1
@JohnBalvinArias! Nie testowałem tego w 100%, ale powiem, że potrzebuje tylko szybkiego bufora ... Nie
cytuj

1
Jeśli sprawdzę stronę, w zakładce Sieć otrzymuję prośbę o wideo, które mogę po prostu otworzyć w nowej karcie.
Simone

10

PHP wysyła tag wideo html5 razem z sesją, w której klucz jest losowym ciągiem znaków, a wartością jest nazwa pliku.

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

Teraz PHP jest proszone o przesłanie wideo. PHP odzyskuje nazwę pliku; usuwa sesję i natychmiast wysyła wideo. Dodatkowo muszą być obecne wszystkie nagłówki „no cache” i typu 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:

Teraz, jeśli użytkownik skopiuje adres URL do nowej karty lub skorzysta z menu kontekstowego, nie będzie miał szczęścia.


Podoba mi się rozwiązanie - rozwiązuje pytanie PO. Jedną z niefortunnych rzeczy jest sprawdzenie kodu źródłowego w Chrome i kliknięcie prawym przyciskiem myszy na link. Użytkownik pobierze plik html, który w rzeczywistości będzie plikiem wideo.
user1252280

5

Możesz przynajmniej powstrzymać osoby nieobeznane z technologią przed użyciem menu kontekstowego prawego przycisku myszy, aby pobrać wideo. Możesz wyłączyć menu kontekstowe dla dowolnego elementu za pomocą atrybutu oncontextmenu.

oncontextmenu="return false;"

Działa to w przypadku elementu body (całej strony) lub tylko pojedynczego wideo używającego go wewnątrz tagu wideo.

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

5

Skończyło się na korzystaniu z AWS CloudFront z wygasającymi adresami URL. Film zostanie załadowany, ale do czasu, gdy użytkownik kliknie prawym przyciskiem myszy i wybierze opcję Zapisz jako, adres URL wideo, który otrzymali, wygasł. Wyszukaj tożsamość CloudFront Origin Access.

Utworzenie adresu URL wideo wymaga pary kluczy, którą można utworzyć w interfejsie wiersza polecenia AWS. FYI to nie jest mój kod, ale działa świetnie!

$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
Bardzo niedoceniany komentarz. Radziłbym jednak korzystać z docs.aws.amazon.com/sdk-for-php/v3/developer-guide/ ... obecnie jednak.
Zmart

Jeśli token wygaśnie, czy to oznacza, że ​​nie mogą też poruszać się po filmie? Ponieważ wydaje się, że ponownie łączy się z adresem URL wideo.
Chud37,

4

Moglibyśmy to utrudnić, ukrywając menu kontekstowe, na przykład:

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

3

Prosty sposób +1 i między przeglądarkami: Możesz również umieścić przezroczysty obraz na wideo z indeksem z css i kryciem. Dlatego użytkownicy zobaczą w menu kontekstowym „zapisz obraz jako” zamiast „zapisz wideo”.


2
dlaczego pic ładowanie zajmie trochę czasu, więc umieść tylko tag div, a otrzymają duże menu chromu, takie jak ponowne ładowanie itp.
Waqas Tahir

Nie jestem pewien, ale jeszcze wideo można pobrać poprzez Plik> SaveAs
Arun Kumar

3

Plik

<body oncontextmenu="return false;"> 

nie działa. Chrome i Opera od czerwca 2018 r. Mają podmenu na osi czasu, które umożliwia bezpośrednie pobieranie, więc użytkownik nie musi klikać prawym przyciskiem myszy, aby pobrać ten film. Co ciekawe, Firefox i Edge tego nie mają ...


2

Korzystanie z usługi takiej jak Vimeo: Zaloguj się Vimeo > Goto Video > Settings > Privacy > Mark as Secured, a także wybierz osadzone domeny. Po ustawieniu domen osadzania nikt nie będzie mógł osadzać wideo ani wyświetlać go z przeglądarki, chyba że nastąpi połączenie z określonych domen. Tak więc, jeśli masz zabezpieczoną stronę na serwerze, która ładuje odtwarzacz Vimeo w ramce iframe, utrudnia to poruszanie się.


2

Przede wszystkim zdaj sobie sprawę, że niemożliwe jest całkowite zapobieżenie pobieraniu wideo, wystarczy, że utrudnisz to . Oznacza to, że ukrywasz źródło wideo.

Przeglądarka internetowa tymczasowo pobiera wideo w buforze, więc gdybyś mógł uniemożliwić pobieranie, uniemożliwiłbyś również oglądanie wideo.

Powinieneś również wiedzieć, że <1% całej populacji świata będzie w stanie zrozumieć kod źródłowy, co i tak jest raczej bezpieczne. Nie oznacza to, że nie powinieneś również ukrywać tego w źródle - powinieneś .

Powinieneś nie wyłączyć kliknij prawym przyciskiem myszy, a nawet mniej powinien pojawić się komunikat mówiący "You cannot save this video for copyright reasons. Sorry about that.". Jak zasugerowano w tej odpowiedzi .

Może to być bardzo denerwujące i mylące dla użytkownika. Oprócz tego; jeśli wyłączą JavaScript w swojej przeglądarce, to zrobią mógł i tak kliknąć prawym przyciskiem myszy i zapisać.

Oto sztuczka CSS, której możesz użyć:

video {
    pointer-events: none;
}

CSS nie może zostać wyłączony w przeglądarce, chroniąc wideo bez wyłączania prawego przycisku myszy. Jednak jest jeden problemcontrols nie można ich również włączyć, innymi słowy, muszą być ustawione false. Jeśli zamierzasz wdrożyć własną funkcję Play / Pause lub użyć interfejsu API, który ma przyciski oddzielne od videotagu, jest to wykonalna opcja.

controls posiada również przycisk pobierania, więc używanie go też nie jest dobrym pomysłem.

Oto JSFiddle przykład .


Jeśli zamierzasz wyłączyć kliknięcie prawym przyciskiem myszy za pomocą JavaScript, zapisz również źródło wideo w JavaScript. W ten sposób, jeśli użytkownik wyłączy JavaScript (pozwalając na kliknięcie prawym przyciskiem myszy), wideo nie zostanie załadowane (również trochę lepiej ukrywa źródło wideo).

Z odpowiedzi TxRegex :

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

Teraz dodaj wideo za pomocą JavaScript:

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

Funkcjonalne JSFiddle


Innym sposobem zapobiegania kliknięciu prawym przyciskiem jest użycie embedtagu. Nie zapewnia to jednak elementów sterujących do uruchomienia wideo, więc musiałyby być wprowadzone w JavaScript:

<embed src="https://www.w3schools.com/html/mov_bbb.mp4"></embed>

1
Dodanie adresu URL src za pomocą JavaScript nie jest zbyt przydatne. Inspekcja DOM pokaże URL w widocznym miejscu po ustawieniu go przez skrypt.
Simone

@Simone Zgadzam się, ale jest to lepsze niż pokazywanie tego bezpośrednio w źródle html, gdzie każdy, kto kliknie prawym przyciskiem myszy, może go natychmiast zobaczyć. Zawsze możesz podzielić adres URL lub zaszyfrować go. Ale pamiętaj, że to dodatkowe przetwarzanie
Simon

„CSS nie może zostać wyłączony w przeglądarce” - Technicznie rzecz biorąc, możesz zmodyfikować CSS w narzędziach programistycznych przeglądarki internetowej, aby wyłączyć niektóre reguły CSS, aby osoba bardziej obeznana z technologią mogła je usunąćpointer-events: none;
Phil Gibbins

2

cóż, nie możesz tego chronić w 100%, ale możesz to utrudnić. z tymi metodami, które wyjaśniam, zetknąłem się z nimi studiując metody ochrony w PluralSight i BestDotNetTraining . niemniej jednak żadna z tych metod nie powstrzymała mnie przed pobraniem tego, czego chcę, ale trudno mi było wybrać program do pobierania, aby przekazał ich ochronę.

Oprócz innych wymienionych metod, aby wyłączyć menu kontekstowe. użytkownik nadal może korzystać z narzędzi innych firm, takich jak InternetDownload Manager lub inne podobne oprogramowanie, aby pobrać filmy. metoda ochrony, którą tutaj wyjaśniam, polega na złagodzeniu tego oprogramowania innych firm.

Wymóg wszystkich tych metod polega na blokowaniu użytkownika, gdy zidentyfikujesz, że ktoś pobiera Twoje filmy. w ten sposób mogą pobrać tylko jeden lub dwa filmy tylko przed zablokowaniem im dostępu do Twojej witryny.

zrzeczenie się

Nie przyjmuję żadnej odpowiedzialności, jeśli ktoś nadużyje tych metod lub użyje ich do zaszkodzenia innym lub stronom internetowym, o których wspomniałem jako przykład. służy tylko do dzielenia się wiedzą, aby pomóc Ci chronić swój produkt intelektualny.

generować linki z wygaśnięciem

warunkiem jest utworzenie łącza pobierania dla każdego użytkownika. że można go łatwo obsłużyć przez Azure Blob Storage lub Amazon S3. możesz utworzyć łącze pobierania z dwukrotnie dłuższym znacznikiem czasu wygaśnięcia wideo. następnie musisz przechwycić to łącze wideo i żądany czas. jest to konieczne w przypadku następnej metody. Połów tej metody polega na tym, że generujesz łącze pobierania, gdy użytkownik kliknie przycisk odtwarzania.

w przypadku przycisku odtwarzania wyślesz żądanie do serwera, otrzymasz łącze i zaktualizujesz źródło.

ogranicz szybkość żądań wideo

następnie monitorujesz, jak szybko użytkownik żąda drugiego filmu. jeśli użytkownik zażąda linku do pobrania zbyt szybko, blokujesz go od razu. nie możesz ustawić tego progu zbyt wysoko, ponieważ możesz omyłkowo zablokować użytkowników, którzy tylko przeglądają lub przeglądają filmy.

Włącz zakres HTTP

użyj biblioteki js, takiej jak videojs, aby odtworzyć wideo, musisz również zwrócić AcceptRange w nagłówku. Usługa Azure Blob Storage obsługuje to po wyjęciu z pudełka. w ten sposób przeglądarka zaczyna pobierać fragment wideo po fragmencie. zwykle 32 bajty na 32 bajty. Następnie musisz słuchać timeupdatezmian wideo i aktualizować serwer o procent oglądania wideo. procent obejrzenia filmu nie może być większy niż procent dostarczenia filmu. a jeśli dostarczasz treści wideo bez zmiany procentowej, możesz zablokować użytkownika. bo na pewno pobierają.

implementacja tego jest trudna, ponieważ użytkownik może przeskakiwać wideo do przodu lub do tyłu, więc bądź świadomy tego, kiedy to wdrażasz.

w ten sposób BestDotnetTraining obsługuje 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);
            }
        });
    }

});

w każdym razie użytkownik może obejść ten problem, używając metody pobierania, która pobiera plik za pośrednictwem przesyłania strumieniowego. prawie c # zrób to po wyjęciu z pudełka, a dla nodejs możesz użyć requestmodule. Następnie musisz uruchomić stopWatch, odsłuchać otrzymaną paczkę i porównać łączną liczbę otrzymanych bajtów z całkowitym rozmiarem. w ten sposób możesz obliczyć procent i czas poświęcony na uzyskanie tej ilości procentu. następnie użyj Thread.Sleep()lub czegoś podobnego, aby opóźnić wątek o kwotę, którą musisz czekać, jeśli oglądasz wideo normalnie. również przed zaśnięciem użytkownik może zadzwonić do serwera i zaktualizować otrzymaną wartość procentową. więc serwer myśli, że użytkownik faktycznie ogląda wideo.

obliczenie będzie wyglądało mniej więcej tak, na przykład, jeśli obliczysz, że do tej pory otrzymałeś 1 procent, to możesz obliczyć kwotę, którą powinieneś poczekać, aby uśpić wątek pobierania. w ten sposób nie możesz pobrać filmu szybciej niż jego rzeczywista długość. jeśli film trwa 24 min. pobranie go zajmie 24 minuty. (plus próg, który postawiliśmy w pierwszej metodzie)

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

sprawdź agenta przeglądarki

kiedy obsługujesz stronę internetową i udostępniasz łącze wideo lub akceptujesz żądanie aktualizacji postępu, możesz spojrzeć na agenta przeglądarki. jeśli jest inny, zablokuj użytkownika.

pamiętaj tylko, że stara przeglądarka nie przekazuje tych informacji. więc powinieneś to zignorować, gdy nie ma agenta przeglądarki zarówno w żądaniu wideo, jak i żądaniu strony internetowej. ale jeśli jedno żądanie ma to, a inne nie, to powinieneś zbanować użytkownika.

Aby obejść ten problem, użytkownik może ręcznie ustawić nagłówek agenta przeglądarki tak samo, jak w przeglądarce bezgłowej, której używa do przechwytywania łącza pobierania.

sprawdź nagłówek referer

gdy strona odsyłająca jest czymś innym niż adres URL hosta lub adres URL strony, na której serwujesz wideo, możesz zablokować użytkownika, ponieważ umieścił on łącze pobierania w innej karcie lub innej aplikacji. nawet możesz to zrobić dla żądania aktualizacji postępu.

warunkiem jest mapowanie wideo i strony, która pokazuje ten film. możesz stworzyć jakąś konwencję lub wzorzec, aby zrozumieć, jaki powinien być adres URL, to zależy od twojego projektu.

Aby obejść ten problem, użytkownik może ręcznie ustawić nagłówek strony odsyłającej jako równy adresowi URL strony pobierania podczas pobierania filmów.

Oblicz czas między żądaniami

jeśli otrzymujesz tyle żądań, że czas między nimi jest taki sam, powinieneś zablokować użytkownika. Powinieneś to ustawić, aby uchwycić czas między żądaniem wygenerowania łącza wideo. jeśli są takie same (plus / minus pewien próg) i zdarza się to więcej niż kilka razy, możesz zbanować użytkownika. ponieważ jeśli istnieje bot, który ma zaindeksować twoją witrynę lub filmy, zwykle ma taki sam czas snu między swoimi żądaniami. więc jeśli otrzymasz każde żądanie, na przykład co 1,3 (plus / min trochę odchylenia) minuty. wtedy podnosisz alarm. w tym celu możesz użyć obliczeń statystycznych, aby poznać odchylenie między żądaniami.

aby obejść ten problem, użytkownik może ustawić losowy czas uśpienia między żądaniami.

przykładowy kod

Mam repozytorium PluralSight-Downloader, które robi to w połowie. Stworzyłem to repozytorium prawie 5 lat temu. ponieważ napisałem go tylko do celów edukacyjnych i do własnego użytku osobistego, repozytorium nie otrzymało dotychczas żadnych aktualizacji i nie zamierzam aktualizować ani ułatwiać pracy z nim. to tylko przykład tego, jak można to zrobić.



1

Krótka odpowiedź: Zaszyfruj link tak, jak robi to youtube, nie wiem jak, tylko zapytaj youtube / google, jak to robią. (Na wypadek gdybyś chciał od razu przejść do sedna).

Chciałbym każdemu zwrócić uwagę, że jest to możliwe, ponieważ robi to youtube, a jeśli mogą, to każda inna strona internetowa i nie jest też z przeglądarki, ponieważ przetestowałem to na kilku przeglądarkach, takich jak Microsoft Edge i Internet Explorer i więc jest sposób, aby to wyłączyć i zobaczyłem, że ludzie nadal to mówią ... Próbuję znaleźć odpowiedź, ponieważ jeśli możesz, to musi być sposób, a jedyny sposób, aby zobaczyć, jak to robią, to jeśli ktoś zajrzy skrypty youtube, które teraz robię. Sprawdziłem również, czy to również było niestandardowe menu kontekstowe i nie jest tak, ponieważ menu kontekstowe przepływa przez element inspect i mam na myśli, że jest nad nim i patrzyłem i nigdy nie tworzy nowej klasy, a także nie można uzyskać dostępu do elementu inspect za pomocą javascript, więc nie można. Możesz stwierdzić, że po dwukrotnym kliknięciu wideo z YouTube prawym przyciskiem myszy pojawia się menu kontekstowe dla chrome. Poza tym… youtube nie dodałby tej funkcji. Prowadzę badania i przeglądam źródło youtube, więc wrócę, jeśli znajdę odpowiedź… jeśli ktoś powie, że nie możesz, to dobrze, że nie. nie rób badań, tak jak ja. Jedynym sposobem pobierania filmów z YouTube jest pobieranie wideo.

Okay ... Zrobiłem badania i moje badania pozostają, że możesz je wyłączyć, chyba że nie ma w nim javascript ... musisz być w stanie zaszyfrować linki do wideo, aby móc go wyłączyć, ponieważ myślę, że każdy przeglądarka nie pokaże tego, jeśli nie może go znaleźć, a kiedy otworzyłem link do filmu na youtube, pokazał się jako ten „blob: https://www.youtube.com/e5c4808e-297e-451f-80da-3e838caa1275„bez cudzysłowów, więc szyfruje go, więc nie można go zapisać ... musisz znać php, ale podobnie jak odpowiedź, którą wybrałeś, aby to utrudnić, youtube sprawia, że ​​szyfrowanie jest najtrudniejsze, musisz być zaawansowany programista php, ale jeśli tego nie wiesz, weź osobę, którą wybrałeś, jako najlepszą odpowiedź na utrudnienie jej pobrania ... ale jeśli znasz php niż ciężki, zaszyfruj link wideo, aby można go było czytać tylko twoje ... Nie wiem, jak wyjaśnić, jak to robią, ale zrobili i jest na to sposób. Sposób, w jaki YouTube szyfruje tam filmy, jest całkiem sprytny, więc jeśli chcesz wiedzieć, jak to zrobić, po prostu zapytaj youtube / google o to robią to ... mam nadzieję, że to ci pomoże, chociaż już wybrałeś najlepszą odpowiedź. Więc szyfrowanie łącza jest najlepsze w krótkich terminach.


0

Wydaje się, że przesyłanie strumieniowe wideo przez gniazdo sieciowe jest realną opcją, ponieważ przesyłanie strumieniowe ramek i rysowanie ich na płótnie jest czymś w rodzaju.

Przesyłanie strumieniowe wideo przez gniazda sieciowe przy użyciu JavaScript

Myślę, że zapewniłoby to inny poziom ochrony, utrudniając klientowi uzyskanie wideo i oczywiście rozwiązując problem za pomocą opcji menu kontekstowego „Zapisz wideo jako ...” (przesada?!).


0

Oto co zrobiłem:

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>
Działa to również w przypadku obrazów, tekstu i prawie wszystkiego. Jednak nadal możesz uzyskać dostęp do narzędzi „Sprawdź” i „Wyświetl źródło” za pomocą skrótów klawiaturowych. (Jak mówi odpowiedź na górze, nie możesz tego całkowicie zatrzymać.) Ale możesz spróbować postawić bariery, aby je powstrzymać.


-1

@ Clayton-Graul miał to, czego szukałem, z wyjątkiem tego, że potrzebowałem wersji CoffeeScript dla strony korzystającej z AngularJS. Na wypadek, gdybyś też tego potrzebował, oto, co umieściłeś w kontrolerze 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

„dziwne rzeczy szykują się na kole k” (to prawda)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.