¿Evitar que se descargue video HTML5 (haga clic con el botón derecho guardado)?

173

¿Cómo puedo desactivar "Guardar video como ..." en el menú contextual del navegador para evitar que los clientes descarguen un video?

¿Existen soluciones más completas que eviten que el cliente acceda a una ruta de archivo directamente?

pitón
fuente
3
He votado a favor de esta pregunta porque solo pregunta absolutamente cómo "deshabilitar el clic derecho" para un video HTML5. No estoy seguro de si es similar a la desactivación del clic derecho para imágenes normales o si hay otros trucos superpuestos, etc., que se pueden aplicar.
3
Incluso si deshabilita el clic derecho, aún pueden guardarlo desde el menú del navegador ( File→Save As). Incluso si de alguna manera pudieras bloquear eso, pueden ver la fuente para encontrar la URL del archivo. Incluso si pudieras ocultar eso un poco, pueden extraerlo del caché. Incluso si pudiera complicar eso (por ejemplo, transmisión), pueden capturar el tráfico de red con un sniffer o algo así. El hecho es que si lo envía a un usuario, puede guardarlo. No hay forma de evitar eso. La pregunta que debe hacer es por qué necesita detenerlo tanto. ¿Es realmente tan necesario? ¿Vale la pena el esfuerzo y la hostilidad del usuario?
Synetech
Me gusta TxRegex responder mejor como una solución básica rápida.
jsherk
Voy a parecer pedante aquí, pero estás sobrecargando el término "descargar". Por supuesto , desea permitir que se descargue el video.
Johan Boulé

Respuestas:

226

No se puede . Eso es porque para eso fueron diseñados los navegadores: Servir contenido . Pero puede dificultar la descarga .

Lo primero es lo primero, puede deshabilitar el contextmenuevento , también conocido como "el clic derecho". Eso evitaría que su skiddie regular rasgue descaradamente su video haciendo clic derecho y Guardar como. Pero luego podrían simplemente deshabilitar JS y evitar esto o encontrar la fuente de video a través del depurador del navegador. Además, esto es mala experiencia de usuario. Hay muchas cosas legítimas en un menú contextual además de Guardar como.

También puede usar bibliotecas de reproductor de video personalizadas. La mayoría de ellos implementan reproductores de video que personalizan el menú contextual a su gusto. Entonces no obtienes el menú contextual predeterminado del navegador. Y si alguna vez sirven un elemento de menú similar a Guardar como, puede deshabilitarlo. Pero, de nuevo, esta es una solución alternativa de JS. Las debilidades son similares a la opción anterior.

Otra forma de hacerlo es servir el video usando HTTP Live Streaming . Lo que esencialmente hace es cortar el video en trozos y servirlo uno tras otro. Así es como la mayoría de los sitios de transmisión sirven videos. Entonces, incluso si logra guardar como, solo guarda un fragmento, no todo el video. Tomaría un poco más de esfuerzo reunir todos los trozos y unirlos con algún software dedicado.

Otra técnica consiste en pintar <video>sobre<canvas> . En esta técnica, con un poco de JavaScript, lo que ves en la página es un <canvas>elemento que procesa fotogramas desde un oculto <video>. Y debido a que es un <canvas>, el menú contextual usará un <img>menú 's, no un <video>' s. Obtendrá Guardar imagen como en lugar de Guardar video como.

También puede usar tokens CSRF para su ventaja. Tendría que su servidor envíe un token en la página. Luego usas ese token para buscar tu video. Su servidor verifica si es un token válido antes de publicar el video u obtiene un HTTP 401 . La idea es que solo puede obtener un video si tiene un token que solo puede obtener si viene de la página, no visitando directamente la URL del video.

Al final del día, simplemente subiría mi video a un sitio de videos de terceros, como YouTube o Vimeo. Tienen buenas herramientas de administración de video, optimizan la reproducción en el dispositivo y hacen esfuerzos para evitar que sus videos se graben sin ningún esfuerzo por su parte.

Joseph
fuente
1
Gracias por la respuesta detallada, ¿es posible al menos deshabilitar la opción Guardar como desde el menú contextual? cubrirá la mayoría de los casos de conocimiento básico
python
2
eso depende del navegador. He visto veces (especialmente Firefox y Chrome) que si el video está completamente cargado, cuando presionas "guardar" simplemente eligen el video del caché en lugar de volver a descargarlo (el video ya está descargado en el caché, ¿por qué descargarlo? de nuevo?), por lo tanto no hay una segunda solicitud. El método anterior solo es aplicable cuando se reutiliza el enlace.
Joseph
1
bueno, encontré un artículo que habla sobre la superposición de la etiqueta de video con un div. actualicé mi respuesta
Joseph
2
Gracias. Acabo de leer craftymind.com/factory/html5video/CanvasVideo.html . La idea es casi la misma que tu respuesta.
Trung
1
@Cupidvogel La "url de uso único" es un punto final del servidor que acepta un token generado por el servidor. El token se genera al generar la página y se guarda en la base de datos. También se envía con la página a partir srcde <video>. Para cuando su página se ha cargado, la base de datos tiene el token, la página tiene el token. Una vez que <video>comienza a cargarse (accede al punto final), el servidor verifica si el token está en la base de datos, lo elimina y transmite el archivo. Si el token no está allí como resultado del segundo acceso , no transmita el archivo.
Joseph
118

Esta es una solución simple para aquellos que desean simplemente eliminar la opción "guardar" con el botón derecho de los videos html5

$(document).ready(function(){
   $('#videoElementID').bind('contextmenu',function() { return false; });
});
Clayton Graul
fuente
Eso es fantástico ! ¡Hace un gran trabajo al evitar que la gente común descargue el video!
Etienne Noël
2
Sin embargo, esto no ayuda si JavaScript está deshabilitado en el navegador.
mvark
2
Gracias, esta solución es suficiente para el 90% de todos nuestros visitantes.
Kai Noack
2
Bleh ¡Simplemente inspeccione el elemento en Firebug, vea el srcatributo y ábralo en otra pestaña o úselo wgetpara descargarlo!
SexyBeast
11
Creo que el objetivo principal de esto es evitar que los usuarios "normales" descarguen el video. Esta es una buena solución para resolver esta situación.
Unapedra
37

Respuesta simple,

NO PUEDES

Si están viendo tu video, ya lo tienen

Puedes ralentizarlos pero no puedes detenerlos.

Starx
fuente
Por cierto, esta respuesta se aplica con videos HTML5, videos flash o cualquier tecnología que pueda imaginar en el futuro. Es simple: así es como funciona.
Gustavo Rodrigues
¿Y qué hay de youtube ?, en youtube no puedes descubrir el archivo de video fácilmente. Quiero decir que está bien, tiene razón, podemos, pero es fácil ocultar la fuente de mp4 en youtube o alojamiento de video similar que alojar un mp4 simple en nuestro servidor y usar el reproductor html5.
dlopezgonzalez
2
Esa no es una respuesta a ninguna de las preguntas.
Tzshand
1
Las personas pueden grabar toda su pantalla y audio y engañar a todas las soluciones, es por eso que solo se pueden ralentizar.
kintsukuroi
1
@IlanSchemoul Interesante. Gracias por compartir :)
Starx
33

Sí, puedes hacer esto en tres pasos:


  1. Coloque los archivos que desea proteger en un subdirectorio del directorio donde se está ejecutando su código.

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

  2. Guarde un archivo en ese subdirectorio llamado ".htaccess" y agregue las líneas a continuación.

    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]

Ahora el enlace de origen es inútil , pero aún debemos asegurarnos de que cualquier usuario que intente descargar el archivo no pueda recibir directamente el archivo.

  1. Para una solución más completa , ahora sirva el video con un reproductor flash (o lienzo html) y nunca enlace directamente al video. Para eliminar el menú del botón derecho, agregue a su HTML:

    <body oncontextmenu="return false;">


El resultado:

www.foo.com/player.html reproducirá correctamente el video , pero si visita www.foo.com/videos/video.mp4:

Código de error 403: PROHIBIDO


Esto funcionará para descarga directa, cURL, hotlinking, lo que sea.

Esta es una respuesta completa a las dos preguntas formuladas y no una respuesta a la pregunta: "¿puedo evitar que un usuario descargue un video que ya ha descargado?"

Tzshand
fuente
1
Gran respuesta, pero tiene un `que debería eliminarlo de su .htaccesscontenido
MAZux
2
Todavía puede falsificar el Referer HTTP, lo que permitirá que una persona descargue. Sin embargo, esta es una solución muy inteligente. Si le dices esto con un código único en el archivo, ¡estás listo!
Shiroy
¡Parece que IDM todavía puede descargarlo!
PersianMan
@PersianMan Correcto - Te animo a leer las primeras respuestas
Tzshand
1
Si deshabilita el javascript del navegador, entonces este truco no funcionará, ya que luego se habilita el clic derecho. Para evitar eso también, debe buscar y cargar el elemento de video dinámicamente usando jquery.
Anindya Sankar Dasgupta
23

La mejor manera que suelo usar es muy simple: deshabilito completamente el menú contextual en toda la página, html + javascript puro:

 <body oncontextmenu="return false;">

¡Eso es! Lo hago porque siempre puedes ver la fuente haciendo clic derecho.
Ok, dices: "Puedo usar directamente la fuente de visualización del navegador" y es cierto, pero comenzamos por el hecho de que NO PUEDES dejar de descargar html5videos.

Daniele Cannova
fuente
Creo que la solución debe ser una que no moleste a los usuarios "normales", deshabilitar el clic derecho evitará que los usuarios copien y peguen texto, o busquen una palabra en la que estén interesados, por ejemplo, en el título del video, por supuesto que no todos los usuarios probablemente harán eso, pero puede ser molesto para algunos de ellos
John Balvin Arias
14

Como desarrollador del lado del cliente, recomiendo usar blob URL, blob URL es una URL del lado del cliente que se refiere a un objeto binario

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

en HTML deje su video en srcblanco, y en JS busque el archivo de video usando AJAX, asegúrese de que el tipo de respuesta sea 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 no se recomienda para archivos grandes

EDITAR

  • Utilice el bloqueo de origen cruzado para evitar la descarga directa

  • si el video es entregado por una API Use un método diferente (PUT / POST) en lugar de 'GET'

Sajan
fuente
3
YouTube también usa Blob ahora, creo :)
C0nw0nk
1
¿Puede explicar lo que está sucediendo aquí más claramente y cómo configurar el servidor para esto?
Anthony
1
@nerdofcode, ¿cómo se comporta eso cuando los usuarios intentan reenviar el video? ¿Tendrán que esperar hasta que se descargue todo el video?
John Balvin Arias
1
@JohnBalvinArias! No he probado este 100%, pero voy a decir que solo necesita un búfer rápido ... Sin embargo, no me cite sobre esto ...
NerdOfCode
1
Si inspecciono la página, en la pestaña Red recibo una solicitud para el video que puedo abrir en una pestaña nueva.
Simone
10

PHP envía la etiqueta de video html5 junto con una sesión donde la clave es una cadena aleatoria y el valor es el nombre del archivo.

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

Ahora se le pide a PHP que envíe el video. PHP recupera el nombre del archivo; elimina la sesión y envía el video al instante. Además, todos los encabezados tipo "no cache" y mime deben 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:

Ahora, si el usuario copia la url en una nueva pestaña o usa el menú contextual, no tendrá suerte.

BF
fuente
Me gusta la solución: resuelve la pregunta de los OP. Una cosa desafortunada es cuando verifica el código fuente en Chrome y hace clic derecho en el enlace. El usuario descargará un archivo html, que de hecho será el archivo de video.
user1252280
5

Al menos puede evitar que las personas no expertas en tecnología utilicen el menú contextual del botón derecho para descargar su video. Puede deshabilitar el menú contextual para cualquier elemento utilizando el atributo oncontextmenu.

oncontextmenu="return false;"

Esto funciona para el elemento del cuerpo (página completa) o para un solo video usándolo dentro de la etiqueta de video.

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

Terminamos usando AWS CloudFront con URL caducadas. El video se cargará, pero para cuando el usuario haga clic derecho y elija Guardar como la url del video que recibió inicialmente ha expirado. Realice una búsqueda de Identidad de acceso a origen de CloudFront.

La producción de la URL del video requiere un par de claves que se pueden crear en la CLI de AWS. FYI, este no es mi código, ¡pero funciona muy bien!

$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>';
profotografía
fuente
1
Comentario muy subestimado. Sin embargo , recomendaría usar docs.aws.amazon.com/sdk-for-php/v3/developer-guide/… hoy en día.
Zmart
Si el token caduca, ¿eso significa que tampoco pueden navegar por el video? Como esto parece ponerse en contacto con la URL del video nuevamente.
Chud37
4

Podríamos hacer que no sea tan fácil ocultando el menú contextual, así:

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

+1 de forma simple y cruzada: también puede colocar una imagen transparente sobre el video con css z-index y opacidad. Por lo tanto, los usuarios verán "guardar imagen como" en lugar de "guardar video" en el menú contextual.

Alex Babak
fuente
2
pic qué se necesitará tiempo para cargar por lo que sólo poner la etiqueta div y se obtendrá un gran menú de cromo como la espalda de recarga, etc
Waqas Tahir
No estoy seguro, pero aún así el video se puede descargar a través de Archivo> Guardar como
Arun Kumar
3

los

<body oncontextmenu="return false;"> 

Ya no funciona. Chrome y Opera a partir de junio de 2018 tienen un submenú en la línea de tiempo para permitir la descarga directa, por lo que el usuario no necesita hacer clic derecho para descargar ese video. Curiosamente, Firefox y Edge no tienen esto ...

Kendolew
fuente
2

Usando un servicio como Vimeo: Inicie sesión Vimeo > Goto Video > Settings > Privacy > Mark as Securedy también seleccione dominios incrustados. Una vez que se configuran los dominios de inserción, no permitirá que nadie incruste el video o lo muestre desde el navegador a menos que se conecte desde los dominios especificados. Por lo tanto, si tiene una página segura en su servidor que carga el reproductor Vimeo en iframe, esto hace que sea bastante difícil moverse.

Comentario Usuario
fuente
2

En primer lugar , tenga en cuenta que es imposible evitar por completo la descarga de un video, todo lo que puede hacer es hacerlo más difícil . Es decir, escondes la fuente del video.

Un navegador web descarga temporalmente el video en un búfer, por lo que si pudiera evitar la descarga, también evitaría que se vea el video.

También debe saber que <1% de la población total del mundo podrá comprender el código fuente, lo que lo hace bastante seguro de todos modos. Eso no significa que no deba ocultarlo también en la fuente, debería hacerlo .

Usted debe no deshabilitar el botón derecho, y menos aún debe mostrar un mensaje que dice "You cannot save this video for copyright reasons. Sorry about that.". Como se sugiere en esta respuesta .

Esto puede ser muy molesto y confuso para el usuario. Aparte de eso; si deshabilitan JavaScript en su navegador , podrán hacer clic derecho y guardar de todos modos.

Aquí hay un truco CSS que puedes usar:

video {
    pointer-events: none;
}

CSS no se puede desactivar en el navegador, protegiendo su video sin deshabilitar el clic derecho. Sin embargo, un problema es que controlstampoco se puede habilitar, en otras palabras, deben configurarse false. Si va a implementar su propia función Reproducir / Pausa o usar una API que tiene botones separados a la videoetiqueta, entonces esta es una opción factible.

controls también tiene un botón de descarga, por lo que usarlo tampoco es una buena idea.

Aquí hay un ejemplo de JSFiddle .


Si va a deshabilitar el clic derecho usando JavaScript, también almacene la fuente del video en JavaScript también. De esa manera, si el usuario deshabilita JavaScript (permitiendo el clic derecho), el video no se cargará (también oculta la fuente de video un poco mejor).

De la respuesta TxRegex :

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

Ahora agregue el video a través de JavaScript:

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

JSFiddle funcional


Otra forma de evitar el clic derecho implica usar la embedetiqueta. Sin embargo, esto no proporciona los controles para ejecutar el video, por lo que tendrían que ser implementados en JavaScript:

<embed src="https://www.w3schools.com/html/mov_bbb.mp4"></embed>
Simón
fuente
1
Agregar la URL src a través de JavaScript no es muy útil. Inspeccionar el DOM mostrará la URL a simple vista después de que la secuencia de comandos lo haya configurado.
Simone
@Simone Estoy de acuerdo, sin embargo, es mejor que mostrarlo directamente en la fuente html, donde cualquiera que haga clic derecho puede verlo de inmediato. Siempre puedes dividir la url o encriptarla. Pero recuerde que es un procesamiento adicional
Simon,
"CSS no se puede desactivar en el navegador": técnicamente puede modificar el CSS en las herramientas de desarrollo del navegador web para deshabilitar ciertas reglas de CSS, de modo que una persona con más conocimientos técnicos pueda eliminarlopointer-events: none;
Phil Gibbins
2

bueno, no puedes protegerlo al 100% pero puedes hacerlo más difícil. Estos métodos que estoy explicando los enfrenté durante el estudio de los métodos de protección en PluralSight y BestDotNetTraining . sin embargo, ninguno de estos métodos me impidió descargar lo que quiero, pero tuve dificultades para seleccionar al descargador para que pasara su protección.

Además de otros métodos mencionados para deshabilitar el menú contextual. el usuario aún puede usar herramientas de terceros como InternetDownload manager u otro software similar para descargar los videos. El método de protección que estoy explicando aquí es mitigar el software de terceros.

El requisito de todos estos métodos es bloquear a un usuario cuando identifica que alguien está descargando sus videos. de esta manera, solo pueden descargar uno o dos videos antes de que les prohibiera el acceso a su sitio web.

Descargo de responsabilidad

No aceptaré ninguna responsabilidad si alguien abusa de estos métodos o lo usa para dañar a otros o los sitios web que mencioné como ejemplo. es solo para compartir conocimientos para ayudarlo a proteger su producto intelectual.

generar enlaces con vencimiento

El requisito para esto es crear un enlace de descarga por usuario. ese puede ser fácilmente manejado por azure blob storage o amazon s3. puede crear un enlace de descarga con el doble de la marca de tiempo de caducidad del video. entonces necesita capturar ese enlace de video y el tiempo que se solicita. Esto es necesario para el siguiente método. El problema con este método es que está generando el enlace de descarga cuando el usuario hace clic en el botón Reproducir.

En el evento de botón de reproducción, enviará una solicitud al servidor y obtendrá el enlace y actualizará la fuente.

acelerar la tasa de solicitud de video

luego monitorea qué tan rápido solicita el usuario el segundo video. si el usuario solicita un enlace de descarga demasiado rápido, los bloquea de inmediato. no puede poner este umbral demasiado grande porque puede bloquear por error a los usuarios que solo están navegando o hojeando los videos.

Habilitar rango HTTP

use una biblioteca js como videojs para reproducir su video, también debe devolver un AcceptRange en su encabezado. Azure Blob Storage lo admite de forma inmediata. de esta manera, el navegador comienza a descargar el video fragmento por fragmento. generalmente, 32byte por 32byte. entonces debe escuchar el timeupdatecambio de videojs y actualizar su servidor sobre el porcentaje de reproducción del video. el porcentaje que se ve el video no puede ser mayor que el porcentaje que se entrega el video. y si está entregando un contenido de video sin recibir ningún cambio porcentual, puede bloquear al usuario. porque seguro que se están descargando.

implementar esto es complicado porque el usuario puede omitir el video hacia adelante o hacia atrás, así que tenga en cuenta esto cuando lo implemente.

así es como BestDotnetTraining está manejando el 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 todos modos, el usuario puede solucionar esto utilizando algún método de descarga que descargue un archivo a través de la transmisión. casi c # lo hace fuera de la caja y para nodejs, puede usar el requestmódulo. entonces debe iniciar un cronómetro, escuchar un paquete recibido y comparar el byte total recibido en comparación con el tamaño total. de esta manera puede calcular un porcentaje y el tiempo empleado para obtener esa cantidad de porcentaje. luego use Thread.Sleep()o algo así para retrasar el hilo la cantidad que tiene que esperar si mira el video normalmente. también antes de la suspensión, el usuario puede llamar al servidor y actualizar el porcentaje que se recibe. entonces el servidor piensa que el usuario realmente está viendo un video.

el cálculo será algo como esto, por ejemplo, si calcula que recibió el 1 por ciento hasta ahora, puede calcular la cantidad que debe esperar para dormir el hilo de descarga. de esta manera no puede descargar un video más rápido de lo que es su duración real. si un video es de 24 min. Tardará 24 minutos en descargarlo. (más el umbral que ponemos en el primer 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 el agente del navegador

cuando está sirviendo una página web y sirviendo el enlace del video o aceptando la solicitud de actualización de progreso, puede mirar al agente del navegador. si es diferente, entonces prohíba al usuario.

solo tenga en cuenta que algunos navegadores antiguos no pasan esta información. por lo tanto, debe ignorar esto cuando no haya un agente de navegador tanto en la solicitud de video como en la solicitud de página web. pero si una solicitud la tiene y otra no, entonces debe prohibir al usuario.

Para solucionar este problema, el usuario puede configurar el encabezado del agente del navegador manualmente igual que el navegador sin cabeza que está utilizando para capturar el enlace de descarga.

verifique el encabezado del árbitro

cuando el árbitro no es la URL de su host o la URL de la página a la que está enviando el video, puede prohibir al usuario, ya que coloca el enlace de descarga en otra pestaña u otra aplicación. incluso puede hacerlo para la solicitud de actualización de progreso.

el requisito para esto es tener una asignación de video y la página que muestra ese video. puede crear alguna convención o patrón para comprender cuál debería ser la URL, depende de su diseño.

para evitarlo, el usuario puede establecer el encabezado de referencia de forma manual igual a la URL de la página de descarga al descargar los videos.

Calcule el tiempo entre solicitudes

Si recibe tantas solicitudes que el tiempo entre ellas es el mismo, debe bloquear al usuario. debe poner esto para capturar cuánto tiempo transcurre entre la solicitud de generación de enlace de video. si son iguales (más / menos algún umbral) y ocurre más de una cantidad de veces, puede prohibir al usuario. porque si hay un robot que va a rastrear su sitio web o videos, entonces generalmente tienen el mismo tiempo de sueño entre su solicitud. así que si recibe cada solicitud, por ejemplo, cada 1.3 minutos (más / minutos de alguna desviación). Entonces levantas la alarma. para esto, puede usar algunos cálculos estadísticos para conocer la desviación entre las solicitudes.

Para solucionar esto, el usuario puede poner un tiempo de suspensión aleatorio entre las solicitudes.

Código de muestra

Tengo un repositorio PluralSight-Downloader que lo está haciendo a mitad de camino. Creé este repositorio hace casi 5 años. porque lo escribí solo para fines de estudio y para uso personal, el repositorio no ha recibido ninguna actualización hasta el momento y no voy a actualizar ni facilitar el trabajo. Es solo un ejemplo de cómo se puede hacer.

Mo Hrad A
fuente
1

Respuesta corta: Cifre el enlace como lo hace youtube, no sé cómo preguntar a youtube / google cómo lo hacen. (Solo en caso de que quiera ir directamente al punto).

Me gustaría señalar a cualquiera que esto es posible porque YouTube lo hace y, si pueden, puede hacerlo cualquier otro sitio web y tampoco desde el navegador porque lo probé en un par de navegadores como Microsoft Edge e Internet Explorer y así que hay una manera de deshabilitarlo y veo que la gente todavía lo dice ... Intento buscar una respuesta porque si YouTube puede, entonces tiene que haber una manera y la única forma de ver cómo lo hacen es si alguien investigó los guiones de youtube que estoy haciendo ahora. También verifiqué si era un menú contextual personalizado y no es porque el menú contextual está sobrecargando el elemento de inspección y quiero decir que ya pasó y miré y nunca crea una nueva clase y también Es imposible acceder realmente al elemento de inspección con JavaScript, por lo que no puede serlo. Puede saber cuando hace doble clic derecho en un video de YouTube que aparece el menú contextual de Chrome. Además ... youtube no agregaría esa función. Estoy investigando y buscando en la fuente de youtube, así que volveré si encuentro la respuesta ... si alguien dice que no puedes, entonces no lo hicieron. No investigue como yo. La única forma de descargar videos de YouTube es a través de una descarga de video.

De acuerdo ... Investigué y mi investigación dice que puedes deshabilitarlo, excepto que no tiene JavaScript ... tienes que poder cifrar los enlaces al video para que puedas deshabilitarlo porque creo que cualquier el navegador no lo mostrará si no puede encontrarlo y cuando abrí un enlace de video de YouTube se mostró como este "blob: https://www.youtube.com/e5c4808e-297e-451f-80da-3e838caa1275"sin comillas, por lo que lo está encriptando para que no se pueda guardar ... necesita saber php para eso, pero al igual que la respuesta que eligió para hacerlo más difícil, YouTube hace que sea más difícil de encriptarlo, necesita ser un programador avanzado de php, pero si no sabe eso, tome la persona que eligió como la mejor respuesta para dificultar la descarga ... pero si sabe php que encriptar el enlace de video para que solo pueda leerse la suya ... No sé cómo explicar cómo lo hacen, pero lo hicieron y hay una manera. La forma en que YouTube Cifra sus videos es bastante inteligente, así que si quieres saber cómo hacerlo, simplemente pregúntale a YouTube / Google cómo lo hacen ... espero que esto te ayude aunque ya hayas elegido la mejor respuesta. Por lo tanto, encriptar el enlace es mejor a corto plazo.

Jonathan J. Pecany
fuente
0

Parece que transmitir el video a través de websocket es una opción viable, como transmitir los cuadros y dibujarlos en un lienzo.

Transmisión de video a través de websockets usando JavaScript

Creo que eso proporcionaría otro nivel de protección haciendo que sea más difícil para el cliente adquirir el video y, por supuesto, resolver su problema con la opción "Guardar video como ..." con el botón derecho del menú contextual (¿demasiado?).

Chico
fuente
0

Esto es lo que hice:

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>
Esto también funciona para imágenes, texto y prácticamente cualquier cosa. Sin embargo, aún puede acceder a la herramienta "Inspeccionar" y "Ver código fuente" a través de métodos abreviados de teclado. (Como dice la respuesta en la parte superior, no puedes detenerlo por completo). Pero puedes tratar de poner barreras para detenerlos.

Calum Childs
fuente
-1

@ Clayton-Graul tenía lo que estaba buscando, excepto que necesitaba la versión CoffeeScript para un sitio que usa AngularJS. En caso de que también lo necesites, esto es lo que pones en el controlador AngularJS en cuestión:

    # 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

"Hay cosas extrañas en el círculo k" (es verdad)

Ryan Crews
fuente