Impedir o download de vídeo HTML5 (clique com o botão direito do mouse salvo)?

171

Como posso desativar "Salvar vídeo como ..." no menu de atalho do navegador para impedir que os clientes baixem um vídeo?

Existem soluções mais completas que impedem o cliente de acessar diretamente o caminho de um arquivo?

Pitão
fonte
3
Votei positivamente nesta questão, porque ela apenas pede absolutamente como "desativar o botão direito" de um vídeo HTML5. Não tenho certeza se é semelhante à desabilitação com o botão direito do mouse para imagens normais ou se existem outros truques de sobreposição, etc., que podem ser aplicados.
3
Mesmo se você desativar o botão direito, eles ainda poderão salvá-lo no menu do navegador ( File→Save As). Mesmo que você possa bloquear isso, eles podem visualizar a fonte para encontrar o URL do arquivo. Mesmo que você possa obscurecer um pouco, eles podem extraí-lo do cache. Mesmo que você possa complicar isso (por exemplo, fluxo), eles podem capturar o tráfego da rede com um sniffer ou algo assim. O fato é que, se você enviar para um usuário, ele poderá salvá-lo. Não há maneira de contornar isso. A pergunta que você precisa fazer é por que você precisa parar tanto. É mesmo necessário? Vale a pena o esforço e a hostilidade do usuário?
21315 Synetech
Eu gosto do TxRegex responder da melhor maneira possível, como uma solução básica rápida.
Jsherk
Vou parecer pedante aqui, mas você está sobrecarregando o termo "download". É claro que você deseja permitir que o vídeo seja baixado.
Johan Boulé

Respostas:

226

Você não pode . Isso é o que os navegadores foram projetados para fazer: exibir conteúdo . Mas você pode dificultar o download .

Primeiro, você pode desativar o contextmenuevento , também conhecido como "clique com o botão direito". Isso impediria que seu skiddie comum rasgasse seu vídeo descaradamente clicando com o botão direito do mouse e Salvar como. Mas eles poderiam simplesmente desativar o JS e contornar isso ou encontrar a fonte de vídeo através do depurador do navegador. Além disso, este é um mau UX. Há muitas coisas legítimas em um menu de contexto do que apenas Salvar como.

Você também pode usar bibliotecas personalizadas do player de vídeo. A maioria deles implementa players de vídeo que personalizam o menu de contexto ao seu gosto. Portanto, você não obtém o menu de contexto do navegador padrão. E, se houver, eles servem um item de menu semelhante ao Salvar como, você pode desativá-lo. Mas, novamente, esta é uma solução JS. Fraquezas são semelhantes à opção anterior.

Outra maneira de fazer isso é veicular o vídeo usando o HTTP Live Streaming . O que ele basicamente faz é dividir o vídeo em pedaços e servi-lo um após o outro. É assim que a maioria dos sites de streaming veiculam vídeos. Portanto, mesmo que você consiga salvar como, salve apenas um pedaço, não o vídeo inteiro. Seria necessário um pouco mais de esforço para reunir todos os pedaços e costurá-los usando algum software dedicado.

Outra técnica é a pintar <video>sobre<canvas> . Nesta técnica, com um pouco de JavaScript, o que você vê na página é um <canvas>elemento que renderiza quadros de um oculto <video>. E por ser um <canvas>, o menu de contexto usará o menu de um <img>, não um <video>. Você receberá um Salvar imagem como em vez de um Salvar vídeo como.

Você também pode usar tokens CSRF para sua vantagem. Seu servidor enviaria um token na página. Você então usa esse token para buscar seu vídeo. Seu servidor verifica se é um token válido antes de exibir o vídeo ou obtém um HTTP 401 . A idéia é que você só pode obter um vídeo com um token que só poderá obter se vier da página e não visitar diretamente o URL do vídeo.

No final do dia, eu acabava de enviar meu vídeo para um site de vídeo de terceiros, como o YouTube ou o Vimeo. Eles têm boas ferramentas de gerenciamento de vídeo, otimizam a reprodução no dispositivo e fazem esforços para impedir que seus vídeos sejam copiados com o máximo esforço possível.

Joseph
fonte
1
obrigado pela resposta detalhada, é possível pelo menos desativar a opção salvar como no menu do botão direito? ele abrangerá a maioria dos casos de conhecimento básico
python
2
isso depende do navegador. Eu já vi vezes (especialmente firefox e chrome) que, se o vídeo estiver totalmente carregado, quando você clica em "salvar", eles apenas escolhem o vídeo do cache em vez de fazer o download novamente (o vídeo já foi baixado no cache, por que baixá-lo novamente?), portanto, não há um segundo pedido. o método acima é aplicável apenas quando o link é reutilizado.
317 Joseph
1
Bem, encontrei um artigo falando sobre a sobreposição da tag de vídeo com uma div. atualizei minha resposta
Joseph
2
Obrigado. Acabei de ler craftymind.com/factory/html5video/CanvasVideo.html . A ideia é quase igual à sua resposta.
Trung
1
@Cupidvogel O "URL de uso único" é um ponto de extremidade do servidor que aceita um token gerado pelo servidor. O token é gerado na geração da página e salvo no banco de dados. Também é enviado com a página a partir srcdo <video>. No momento em que sua página é carregada, o banco de dados possui o token, a página possui o token. Depois <video>que o carregamento é iniciado (acessa o terminal), o servidor verifica se o token está no banco de dados, o exclui e transmite o arquivo. Se o token não estiver lá como resultado do segundo acesso , não transmita o arquivo.
Joseph
118

Esta é uma solução simples para aqueles que desejam simplesmente remover a opção "salvar" do botão direito dos vídeos html5

$(document).ready(function(){
   $('#videoElementID').bind('contextmenu',function() { return false; });
});
Clayton Graul
fonte
Isso é fantastico ! Ele faz um ótimo trabalho ao impedir que pessoas comuns baixem o vídeo!
Etienne Noël
2
No entanto, isso não ajuda se o JavaScript estiver desativado no navegador.
Mvark
2
Obrigado, esta solução é suficiente para 90% de todos os nossos visitantes.
Kai Noack
2
Bleh. Basta inspecionar o elemento no Firebug, ver o srcatributo e abrir em outra guia ou usar wgetpara fazer o download!
SexyBeast 3/09/14
11
Eu acho que o principal objetivo disso é evitar que usuários "normais" baixem o vídeo. Esta é uma boa solução para resolver esta situação.
Unapedra 5/09/14
37

Resposta simples,

VOCÊ NÃO PODE

Se eles estão assistindo seu vídeo, eles já o têm

Você pode desacelerá-los, mas não pode detê-los.

Starx
fonte
A propósito, esta resposta se aplica a vídeos HTML5, vídeos em flash ou qualquer tecnologia que você possa imaginar no futuro. É simples: é assim que funciona.
Gustavo Rodrigues
E o youtube ?, no youtube você não pode descobrir o arquivo de vídeo facilmente. Quero dizer que ok, você está certo, nós podemos, mas é fácil esconder a fonte mp4 no youtube ou hospedagem de vídeo semelhante ao hospedar um simples mp4 em nosso servidor e usar o player html5.
dlopezgonzalez
2
Essa não é uma resposta para nenhuma das perguntas.
Tzshand
1
As pessoas podem gravar sua tela inteira e o áudio e enganar todas as soluções alternativas, é por isso que elas só podem ser mais lentas.
kintsukuroi 28/04
1
@IlanSchemoul Interesting. Obrigado por compartilhar :)
Starx
33

Sim, você pode fazer isso em três etapas:


  1. Coloque os arquivos que você deseja proteger em um subdiretório do diretório em que seu código está sendo executado.

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

  2. Salve um arquivo nesse subdiretório chamado ".htaccess" e adicione as linhas abaixo.

    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]

Agora, o link de origem é inútil , mas ainda precisamos garantir que qualquer usuário que esteja tentando fazer o download do arquivo não possa receber diretamente o arquivo.

  1. Para uma solução mais completa , agora sirva o vídeo com um flash player (ou tela html) e nunca vincule diretamente ao vídeo. Para remover apenas o menu do botão direito, adicione ao seu HTML:

    <body oncontextmenu="return false;">


O resultado:

www.foo.com/player.html reproduzirá o vídeo corretamente , mas se você visitar www.foo.com/videos/video.mp4:

Código de erro 403: FORBIDDEN


Isso funcionará para download direto, cURL, hotlinking, etc.

Esta é uma resposta completa para as duas perguntas feitas e não uma resposta para a pergunta: "posso impedir que um usuário baixe um vídeo que já baixou".

Tzshand
fonte
1
Ótima resposta, mas você tem um `que deve removê-lo do seu .htaccessconteúdo
MAZux
2
Você ainda pode falsificar o Referenciador HTTP, que permitirá que uma pessoa faça o download. No entanto, esta é uma solução muito inteligente. Se você discordar disso com um código único no arquivo, você estará pronto!
Shiroy 01/09/19
Parece que o IDM ainda pode baixá-lo!
PersianMan
@PersianMan Correct - Encorajo-vos a ler as primeiras respostas
Tzshand
1
Se você desativar o javascript do navegador, esse truque não funcionará, pois o botão direito do mouse será ativado. Para evitar isso também, você deve buscar e carregar o elemento de vídeo dinamicamente usando jquery.
Anindya Sankar Dasgupta
23

A melhor maneira que eu costumo usar é muito simples, desabilito totalmente o menu de contexto em toda a página, puro html + javascript:

 <body oncontextmenu="return false;">

É isso aí! Eu faço isso porque você sempre pode ver a fonte clicando com o botão direito.
Ok, você diz: "Posso usar diretamente a fonte de visualização do navegador" e é verdade, mas começamos pelo fato de que você NÃO PODE parar de baixar html5vídeos.

Daniele Cannova
fonte
Eu acho que a solução deve ser aquela que não perturbe usuários "normais", desabilitar o botão direito do mouse impedirá que os usuários copiem e colem algum texto ou pesquisem uma palavra na qual estejam interessados, por exemplo, no título do vídeo, é claro que não todos os usuários provavelmente vai fazer isso, mas Ele pode ser anoying para alguns deles
John Balvin Arias
14

Como desenvolvedor do lado do cliente, recomendo usar o URL de blob, o URL de blob é um URL do lado do cliente que se refere a um objeto binário

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

em HTML, deixe seu vídeo em srcbranco e, em JS, busque o arquivo de vídeo usando AJAX, verifique se o tipo de resposta é 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();
}

Nota: Este método não é recomendado para arquivos grandes

EDITAR

  • Use o bloqueio de origem para evitar o download direto

  • se o vídeo for entregue por uma API, use um método diferente (PUT / POST) em vez de 'GET'

Sajan
fonte
3
YouTube usa Blob agora também eu acho :)?
C0nw0nk
1
Você pode explicar o que está acontecendo aqui mais claramente e como configurar o servidor para isso?
Anthony
1
@nerdofcode como isso se comporta quando os usuários tentam encaminhar o vídeo? Eles precisarão esperar até o download de todo o vídeo?
John Balvin Arias
1
@JohnBalvinArias! Eu não testei isso 100%, mas eu vou dizer que ele só precisa de um buffer rápida ... não citar-me sobre isso, porém ...
NerdOfCode
1
Se eu inspecionar a página, na guia Rede, recebo uma solicitação para o vídeo que posso abrir em uma nova guia.
Simone
10

O PHP envia a tag de vídeo html5 juntamente com uma sessão em que a chave é uma sequência aleatória e o valor é o nome do arquivo.

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

Agora, o PHP é solicitado a enviar o vídeo. PHP recupera o nome do arquivo; exclui a sessão e envia o vídeo instantaneamente. Além disso, todos os cabeçalhos 'no cache' e do tipo mime devem estar presentes.

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:

Agora, se o usuário copiar o URL em uma nova guia ou usar o menu de contexto, ele não terá sorte.

BF
fonte
Eu gosto da solução - resolve a questão dos OPs. Uma coisa lamentável é que, quando verifica o código-fonte no Chrome e clica com o botão direito do mouse no link. O usuário fará o download de um arquivo html, que de fato será o arquivo de vídeo.
usar o seguinte comando
5

Você pode pelo menos impedir que as pessoas mais experientes em tecnologia não usem o menu de contexto do botão direito do mouse para baixar seu vídeo. Você pode desativar o menu de contexto para qualquer elemento usando o atributo oncontextmenu.

oncontextmenu="return false;"

Isso funciona para o elemento body (página inteira) ou apenas para um único vídeo usando-o dentro da tag video.

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

Acabamos usando o AWS CloudFront com URLs expirados. O vídeo será carregado, mas quando o usuário clicar com o botão direito do mouse e escolher Salvar Como o URL do vídeo recebido inicialmente expirou. Faça uma pesquisa pela identidade de acesso de origem do CloudFront.

A produção do URL do vídeo requer um par de chaves que pode ser criado na CLI da AWS. Para sua informação, este não é o meu código, mas funciona muito bem!

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

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

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

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

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

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

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

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

return '<div class="videowrapper" ><video autoplay controls style="width:100%!important;height:auto!important;"><source src="'.$url.'" type="video/mp4">Your browser does not support the video tag.</video></div>';
prophoto
fonte
1
Comentário altamente subestimado. Aconselho o uso de docs.aws.amazon.com/sdk-for-php/v3/developer-guide/… hoje em dia, no entanto.
Zmart
Se o token expirar, isso significa que eles também não podem navegar pelo vídeo? Como isso parece entrar em contato com o URL do vídeo novamente.
Chud37
4

Poderíamos tornar isso não tão fácil, ocultando o menu de contexto, assim:

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

+1 de maneira simples e em vários navegadores: você também pode colocar uma imagem transparente sobre o vídeo com z-index e opacidade em css. Assim, os usuários verão "salvar imagem como" em vez de "salvar vídeo" no menu de contexto.

Alex Babak
fonte
2
porque pic isso vai levar tempo para carregar tão somente colocar a tag div e eles vão ter uma grande menu de cromo como a parte traseira de recarga etc
Waqas Tahir
Não estou certo, mas ainda de vídeo pode ser baixado via Arquivo> Salvar como
Arun Kumar
3

o

<body oncontextmenu="return false;"> 

não funciona mais. O Chrome e o Opera, em junho de 2018, possuem um submenu na linha do tempo para permitir o download direto, para que o usuário não precise clicar com o botão direito do mouse para baixar o vídeo. Curiosamente, o Firefox e o Edge não têm isso ...

kendolew
fonte
2

Usando um serviço como o Vimeo: faça login Vimeo > Goto Video > Settings > Privacy > Mark as Securede também selecione domínios incorporados. Depois que os domínios de incorporação são definidos, ele não permitirá que ninguém incorpore ou exiba o vídeo no navegador, a menos que se conecte a partir dos domínios especificados. Portanto, se você possui uma página protegida em seu servidor que carrega o Vimeo player no iframe, isso dificulta a navegação.

CommentUser
fonte
2

Antes de tudo, perceba que é impossível impedir completamente o download de um vídeo, tudo o que você pode fazer é torná-lo mais difícil . Ou seja, você esconde a fonte do vídeo.

Um navegador da Web baixa temporariamente o vídeo em um buffer. Portanto, se você puder impedir o download, também estará impedindo a exibição do vídeo.

Você também deve saber que <1% da população total do mundo será capaz de entender o código fonte, tornando-o bastante seguro de qualquer maneira. Isso não significa que você não deve ocultá-lo também na fonte - você deve .

Você não deve desativar o botão direito e, menos ainda, deve exibir uma mensagem dizendo "You cannot save this video for copyright reasons. Sorry about that.". Como sugerido nesta resposta .

Isso pode ser muito chato e confuso para o usuário. Além disso; se eles desabilitarem o JavaScript no navegador, eles irão ser capaz de clique direito e salvar de qualquer maneira.

Aqui está um truque CSS que você pode usar:

video {
    pointer-events: none;
}

O CSS não pode ser desativado no navegador, protegendo seu vídeo sem realmente desabilitar o clique com o botão direito. No entanto, um problema é que controlstambém não pode ser ativado, ou seja, eles devem ser definidos como false. Se você pretende implantar sua própria função Reproduzir / Pausar ou usar uma API que possui botões separados para a videotag, essa é uma opção viável.

controls também possui um botão de download, portanto, usá-lo também não é uma boa idéia.

Aqui está um exemplo do JSFiddle .


Se você deseja desativar o clique direito usando JavaScript, também armazene a fonte do vídeo em JavaScript também. Dessa forma, se o usuário desabilitar o JavaScript (permitindo clicar com o botão direito), o vídeo não será carregado (também ocultará um pouco melhor a fonte de vídeo).

Da resposta TxRegex :

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

Agora adicione o vídeo via JavaScript:

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

JSFiddle funcional


Outra maneira de impedir o clique direito envolve o uso da embedtag. No entanto, isso não fornece os controles para executar o vídeo; portanto, eles precisam ser incluídos no JavaScript:

<embed src="https://www.w3schools.com/html/mov_bbb.mp4"></embed>
Simon
fonte
1
Adicionar a URL src via JavaScript não é muito útil. Inspecionar o DOM mostrará o URL à vista depois que o script o definir.
Simone
@ Simone, eu concordo, no entanto, é melhor do que mostrá-lo diretamente na fonte html, onde qualquer pessoa que clicar com o botão direito poderá vê-lo imediatamente. Você sempre pode dividir o URL ou criptografá-lo. Mas lembre-se que é o processamento adicional
Simon
"O CSS não pode ser desativado no navegador" - Tecnicamente, você pode modificar o CSS nas ferramentas de desenvolvedor de navegadores da Web para desativar certas regras de CSS, para que uma pessoa mais experiente em tecnologia possa removerpointer-events: none;
Phil Gibbins
2

bem, você não pode protegê-lo 100%, mas pode torná-lo mais difícil. esses métodos que estou explicando, eu os enfrentei durante o estudo de métodos de proteção no PluralSight e BestDotNetTraining . no entanto, nenhum desses métodos me impediu de baixar o que eu quero, mas tive dificuldade em selecionar o downloader para passar sua proteção.

Além de outros métodos mencionados para desativar o menu de contexto. o usuário ainda pode usar ferramentas de terceiros, como o InternetDownload manager ou outro software similar para baixar os vídeos. o método de proteção que estou explicando aqui é mitigar esses softwares de terceiros.

o requisito de todos esses métodos é bloquear um usuário quando você identifica que alguém está baixando seus vídeos. dessa forma, eles podem baixar apenas um ou dois vídeos antes de você os proibir de acessar o seu site.

aviso Legal

Não assumirei nenhuma responsabilidade se alguém abusar desses métodos ou usá-los para prejudicar outras pessoas ou os sites que mencionei como exemplo. é apenas para compartilhar conhecimento e ajudá-lo a proteger seu produto intelectual.

gerar links com uma expiração

o requisito para isso é criar um link de download por usuário. esse pode ser facilmente manipulado pelo armazenamento de blues azuis ou pelo amazon s3. você pode criar um link de download com o dobro do carimbo de data e hora de duração do vídeo. é necessário capturar o link do vídeo e a hora solicitada. isso é necessário para o próximo método. O problema desse método é que você está gerando o link de download quando o usuário clica no botão play.

no evento botão de reprodução, você enviará uma solicitação ao servidor, obterá o link e atualizará a fonte.

acelerar a taxa de solicitação de vídeo

então você monitora a rapidez com que o usuário solicita o segundo vídeo. se o usuário solicitar um link para download muito rápido, você os bloqueará imediatamente. você não pode colocar esse limite muito alto porque pode bloquear por engano os usuários que estão apenas navegando ou percorrendo os vídeos.

Ativar intervalo HTTP

use alguma biblioteca js como videojs para reproduzir seu vídeo, também é necessário retornar um AcceptRange no seu cabeçalho. O armazenamento de blobs do Azure oferece suporte a isso imediatamente. Dessa forma, o navegador começa a baixar o pedaço de vídeo por pedaço. geralmente, 32 bytes por 32 bytes. é necessário ouvir as timeupdatealterações nos videojs e atualizar seu servidor sobre a porcentagem de exibição do vídeo. a porcentagem de exibição do vídeo não pode ser maior que a porcentagem de exibição do vídeo. e se você estiver entregando um conteúdo de vídeo sem receber nenhuma alteração percentual, poderá bloquear o usuário. porque com certeza eles estão baixando.

implementar isso é complicado porque o usuário pode pular o vídeo para frente ou para trás; portanto, esteja ciente disso quando você estiver implementando isso.

é assim que BestDotnetTraining está lidando com o 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);
            }
        });
    }

});

de qualquer maneira, o usuário pode contornar isso usando algum método de download que baixa um arquivo por meio de streaming. quase c # faça isso imediatamente e, para o nodejs, você pode usar o requestmódulo então você precisa iniciar um stopWatch, ouvir um pacote recebido e comparar o total de bytes recebidos e o tamanho total. Dessa forma, você pode calcular uma porcentagem e o tempo gasto para obter essa porcentagem. use Thread.Sleep()ou algo assim para atrasar a quantidade que você precisa esperar para assistir ao vídeo normalmente. também antes do sono, o usuário pode ligar para o servidor e atualizar a porcentagem recebida. para que o servidor pense que o usuário está realmente assistindo a um vídeo.

o cálculo será algo como isto, por exemplo, se você calcular que recebeu 1% até agora, poderá calcular o valor que deve esperar para suspender o encadeamento de download. dessa maneira, você não pode baixar um vídeo mais rapidamente do que a duração real. se um vídeo tiver 24 minutos. leva 24 minutos para fazer o download. (mais o limite que colocamos no primeiro método)

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

verifique o agente do navegador

ao exibir uma página da web e exibir o link do vídeo ou aceitar a solicitação de atualização de progresso, você pode consultar o agente do navegador. se for diferente, banir o usuário.

esteja ciente de que algum navegador antigo não passa essas informações. portanto, você deve ignorá-lo quando não houver um agente do navegador na solicitação de vídeo e na página da web. mas se um pedido o tiver e outro não, você deverá banir o usuário.

Para contornar isso, o usuário pode definir o cabeçalho do agente do navegador manualmente, igual ao navegador sem cabeçalho usado para capturar o link de download.

verifique o cabeçalho do referenciador

quando o referenciador é algo diferente do URL do host ou do URL da página em que você está veiculando o vídeo, você pode banir o usuário, porque eles colocam o link de download em outra guia ou outro aplicativo. até você pode fazer isso para a solicitação de atualização de progresso.

o requisito para isso é ter um mapeamento de vídeo e a página que mostra esse vídeo. você pode criar alguma convenção ou padrão para entender qual deve ser o URL. Depende do seu design.

Para contornar isso, o usuário pode definir o cabeçalho do referenciador manualmente como o URL da página de download ao baixar os vídeos.

Calcular o tempo entre a solicitação

se você receber tantas solicitações que o tempo entre elas é o mesmo, deverá bloquear o usuário. você deve colocar isso para capturar quanto tempo demora entre a solicitação de geração do link do vídeo. se eles são os mesmos (mais / menos algum limite) e isso acontece várias vezes, você pode banir o usuário. porque se houver um bot que rastreie seu site ou vídeos, geralmente eles terão o mesmo tempo de sono entre a solicitação. portanto, se você receber cada solicitação, por exemplo, a cada 1,3 (mais / min. algum desvio) minutos. então você dispara um alarme. para isso, você pode usar algum cálculo estatístico para saber o desvio entre as solicitações.

Para contornar isso, o usuário pode colocar um tempo de suspensão aleatório entre as solicitações.

Código de amostra

Eu tenho um repositório PluralSight-Downloader que está fazendo isso no meio do caminho. Eu criei este repositório há quase 5 anos. como eu o escrevi apenas para fins de estudo e uso pessoal, o repositório ainda não recebeu nenhuma atualização e não vou atualizar nem facilitar o trabalho. é apenas um exemplo de como isso pode ser feito.

Mo Hrad A
fonte
1

Resposta curta: Criptografe o link como o youtube, não sei como perguntar ao youtube / google como eles o fazem. (Apenas no caso de você querer ir direto ao assunto.)

Gostaria de salientar a qualquer um que isso é possível porque o YouTube faz isso e, se puderem, pode qualquer outro site e não é do navegador, porque eu o testei em alguns navegadores, como o Microsoft Edge e o Internet Explorer e então existe uma maneira de desativá-lo e visto que as pessoas ainda o dizem ... Eu tento procurar uma resposta, porque se o youtube puder, deve haver um caminho e a única maneira de ver como eles o fazem é se alguém investigar os scripts do youtube que estou fazendo agora. Também verifiquei para ver se era um menu de contexto personalizado também e não é porque o menu de contexto está sobrecarregando o elemento inspecionar, quero dizer, está sobre ele e olhei e ele nunca cria uma nova classe e também é impossível acessar o elemento inspecionar com javascript, portanto não pode ser. Você pode dizer quando ele clica duas vezes com o botão direito do mouse em um vídeo do youtube que exibe o menu de contexto do chrome. Além disso ... o youtube não adicionaria essa função. Estou pesquisando e pesquisando a fonte do youtube, então voltarei se encontrar a resposta ... se alguém disser que você não pode, então eles não fizeram ' não pesquise como eu. A única maneira de baixar vídeos do youtube é através de um download de vídeo.

Ok ... eu pesquisei e minha pesquisa permanece que você pode desativá-lo, exceto que não há javascript nele ... você deve ser capaz de criptografar os links para o vídeo para que você possa desativá-lo, porque acho que qualquer o navegador não mostrará se não conseguir encontrá-lo e quando abri um link de vídeo do youtube, ele apareceu como este "blob: https://www.youtube.com/e5c4808e-297e-451f-80da-3e838caa1275"sem aspas, para criptografá-lo, para que não possa ser salvo ... você precisa conhecer o php para isso, mas, como a resposta que você escolheu para dificultar o processo, o youtube o torna o mais difícil de criptografar pesado, você precisa ser um programador avançado de php, mas se você não souber disso, considere a pessoa que você escolheu como a melhor resposta para dificultar o download ... mas se você conhece o php do que pesado criptografar o link do vídeo, ele só poderá ser lido em o seu ... Eu não sei como explicar como eles fazem isso, mas eles fizeram e existe uma maneira.A maneira como o YouTube criptografa os vídeos é bastante inteligente, então se você quiser saber como, basta perguntar ao youtube / google como eles fazem isso ... espero que isso ajude você, embora você já tenha escolhido a melhor resposta.Então, criptografar o link é melhor em termos curtos.

Jonathan J. Pecany
fonte
0

Parece que transmitir o vídeo através do websocket é uma opção viável, como transmitir os quadros e desenhá-los em uma espécie de tela.

Transmissão de vídeo em soquetes da Web usando JavaScript

Eu acho que isso forneceria outro nível de proteção, tornando mais difícil para o cliente adquirir o vídeo e, é claro, resolver seu problema com "Salvar vídeo como ...", clique com o botão direito do mouse na opção do menu de contexto (exagero?!).

Cara
fonte
0

Aqui está o que eu fiz:

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>
Isso também funciona para imagens, texto e praticamente qualquer coisa. No entanto, você ainda pode acessar a ferramenta "Inspecionar" e "Exibir fonte" através dos atalhos do teclado. (Como diz a resposta no topo, você não pode impedi-lo completamente.) Mas você pode tentar colocar barreiras para impedi-los.

Calum Childs
fonte
-1

@ Clayton-Graul tinha o que estava procurando, exceto que eu precisava da versão CoffeeScript para um site usando AngularJS. Apenas no caso de você precisar disso, aqui está o que você coloca no controlador AngularJS em questão:

    # 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

"coisas estranhas estão acontecendo no círculo k" (é verdade)

Ryan Crews
fonte