¿Cómo evitar el enlace activo en el contenido binario servido a través de PHP?

0

Estoy tratando de asegurar un script de servicio de bytes, escrito en PHP, en su mayoría tomado de enlace para protegerse contra la vinculación directa del video y la descarga fácil. Por lo tanto, he colocado el video fuera de la raíz http pública. El pseudo-streaming en sí funciona perfectamente bien.

La estructura de las páginas es la siguiente:
mysite.com/ watchvideo.php:

<video>
  <source src="/media.php?t=<?= $t = Token::generate(); ?>" type="video/mp4">
</video>

mysite.com/media.php:

$token = isset($_GET["t"]) ? $_GET["t"] : "";

if (
    !Token::check($token)
    || $_SERVER["HTTP_REFERER"] !== "mysite.com/watchthisawesomevideo.php"
    ) {
        header("HTTP/1.1 403 Forbidden");
        exit;
}

do_the_byte_range_stuff();              // from tuxxin.com

La clase Token simplemente genera una cadena aleatoria, la guarda en la sesión php y la devuelve, respectivamente, cuando la comparación compara el parámetro con el token almacenado en $_SESSION .

Con este método, tengo el problema de que algunos navegadores, como stock y chrome 47 en Android 4.1.2, parecen pasar la transmisión a un proceso diferente, por lo tanto, pierden el HTTP_REFERER (posiblemente relacionado con el problema de Android 1780). Si desactivo el token al verificarlo, las solicitudes subsiguientes para media.php get abortet. Lo mismo ocurre si configuro un límite de tiempo para el token.

Una vez ordenado, ocultaría el video y reflejaría su contenido en un lienzo.

¿Cuáles serían las medidas de seguridad adecuadas para proteger contra la descarga del archivo de video y hacer que media.php sea inaccesible? Sé que no puede haber una protección absoluta, pero quiero hacerlo razonablemente difícil.

Editar: Tenga en cuenta que no estoy buscando algún tipo de DRM para el video, ya que sé que podría grabarse fuera de la pantalla. Estoy buscando formas de llevar el video a la página de videos de video, por lo que solo se puede acceder desde allí y evitar el enlace.

    
pregunta YPOC 26.01.2016 - 18:03
fuente

1 respuesta

2

Puede configurar una cookie cuando el usuario solicita watchvideo.php , que contiene un hash de valores que identifican al cliente, como agente de usuario , dirección IP , y así:

<?php
 $ip = $_SERVER['REMOTE_ADDR'];
 $browser = implode(':', $_SERVER['HTTP_USER_AGENT']);
 $userFingerprint = md5($browser . $ip);
 setcookie('userdata', $userFingerprint, time() + 10); //expires in 10 sec
?>

En media.php , leíste la cookie de nuevo:

<?php
 $ip = $_SERVER['REMOTE_ADDR'];
 $browser = implode(':', $_SERVER['HTTP_USER_AGENT']);
 $userFingerprint = md5($browser . $ip);
 if ($_COOKIE['userdata'] != $userFingerprint) {
    header("HTTP/1.1 403 Forbidden");
    exit;
 }
 do_the_byte_range_stuff();
?>

Usé MD5, porque no me importan las colisiones aquí, solo quiero un hash rápido. Puede ir en exceso y emplear BCrypt o PBKDF2, pero absolutamente no tiene que hacerlo.

    
respondido por el ThoriumBR 27.01.2016 - 13:38
fuente

Lea otras preguntas en las etiquetas