2008-11-13 22 views
6

¿Cuál es la mejor manera de proteger con contraseña los videos de transmisión rápida utilizando php/.htaccess. Se transmiten mediante rtsp, pero puedo usar otros formatos si es necesario.Cómo proteger con contraseña la transmisión de videos con php

Sé cómo hacer la autenticación con php, pero no estoy seguro de cómo configurar la autenticación para que proteja las URL de los archivos de transmisión de manera que el usuario no pueda copiar la URL y compartirla.

¿O estoy pensando demasiado y puedo usar un esquema de autenticación normal y colocar los archivos en un directorio protegido?

Respuesta

0

En primer lugar, es muy fácil burlar a un referer. Esta información se almacena en el navegador del usuario, por lo que un usuario puede simplemente ingresar a su servidor y proporcionar su propio referenciador que coincida con su dominio.

Un par de cosas que usted podría intentar:

En primer lugar, más seguro, pero todavía falsificables. mod_rewrite proporciona la capacidad de verificar las cookies. Lo que podría hacer es establecer una cookie cuando el usuario visite su sitio web que contenga datos poco claros. Entonces, podría modificar su RerwriteCond a algo como esto:

RewriteEngine On 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_COOKIE} obscurename=obscurevalue [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain.com/.*$ [NC] 
RewriteRule \.(asx¦ASX)$ http://www.yourdomain.com/images/leech.gif [R,L] 

Otra, una mejor técnica implicaría trabajar con PHP y tipos MIME. No estoy seguro de hasta qué punto esto sería compatible con la transmisión de contenido, pero supongo que funcionará. Lo que puede hacer es hacer que todos sus enlaces de video apunten a un archivo .php (la cadena de consulta determinará qué video se ha seleccionado). Entonces, cuando un usuario intenta visitar este enlace, se hace algo así:

<?php 
    // You could also check some sort of session variable 
    // that is set when the user visits another part of your 
    // site 
    if(!isLoggedIn()){ 
     header("Location: errorPage.htm"); 
     exit; 
    }else{ 
     // Get the name of the file specified 
     $file = get_file_name($_GET['fileID']); 

     // Specify the proper mime-type for the data you're sending 
     // (this may have to change, depending on your situation) 
     header("Content-type: video/vnd.rn-realvideo"); 

     // Read the file and output it to the browser 
     readfile($file); 
    } 
?> 

De lo que he leído, la mayoría de los servidores saben lo que los tipos MIME están fluyendo tipos MIME, por lo que el navegador debe ser capaz de figura cómo manejar el archivo de transmisión correctamente.

+1

La segunda solución funcionará y es segura. Sin embargo, no es una buena idea pasar grandes archivos (video) a través de php. – Jacco

1

Trate de utilizar el servicio de Amazon S3, tiene sus caprichos, pero tiene sentido una vez que se familiarice con él.

Hay ganchos en su API para obtener temporalmente las URL que están activas durante el tiempo especificado, por lo que puede mostrar la url libremente al visitante porque no funcionará 10 minutos más tarde.

Es casi trivial con php (alrededor de 15 líneas de código), hay muchos ejemplos en sus foros por lo que no es necesario ir desde cero y leer la documentación completa sobre cómo lograr esto.

Qué tipo de autorización hará antes de generar y mostrar enlaces depende de usted.

También puede tener el aspecto de que se publica desde su dominio como video.sudominio.com en lugar de las URL estándar de s3.

Por último, es barato: pagamos alrededor de 2 dólares estadounidenses por el mes de prueba y despliegue cuando cargué 8 GB y lo descargué 3 veces por completo y la descarga se inicializó unas 100 veces. La persona para la que estaba haciendo esto está tan satisfecho por el precio que quiere mover todos sus medios descargables a s3.

Ahora, leyendo todo lo que escribí parece comercial/spam pero estoy tan satisfecho con el servicio porque codifiqué todo para archivos de audio antes, y me llevó días hasta que todo funcionó bien y esto tomó un par de horas para implementar (sobre todo familiarizarse con el servicio).

3

Tanto los servidores web nginx como lighttpd tienen encabezados X-Send-File que puede devolver desde PHP.Entonces puedes hacer tus cheques en PHP y luego server de forma condicional el archivo.

if (check_user_can_access()){ 
    header('X-sendfile: /path/to/file'); 
} else { 
    header('HTTP/1.1 403 Fail!'); 
} 

Lighttpd también tiene un módulo llamado ordenada mod_secure_download que le permite generar programáticamente una URL que sólo será válido por un período de tiempo corto.

Nginx, y posiblemente lighttpd, le permiten limitar la velocidad de descarga, por lo que no está enviando datos de transmisión más rápido de lo que puede consumirse.

De cualquier forma, desea utilizar su servidor web para servir archivos. Servirlos a través de PHP es posible, pero lento.

+1

La mejor recomendación aquí. También estoy de acuerdo en que empleas un módulo para tu httpd. Mucho más fácil que codificar una abstracción completa en tu aplicación. – Till

+0

Tengo problemas cuando realizo una operación de búsqueda. ¿Alguna pista sobre cómo podría implementar una búsqueda usando este método? – sj7

1

Es posible que desee echar un vistazo a: mod_xsendfile (for apache)

Le permite redirigir internamente a un archivo.

Por lo que podría apuntar su enlace de descarga a checkCredentials.php

<?php 
if (isAuthorised($_POST['user'], $_POST['pass'])) { 
    header("X-Sendfile: $somefile"); 
    header("Content-Type: application/octet-stream"); 
    header("Content-Disposition: attachment; file=\"$somefile\""); 
    exit(0); 
} else { 
    show403('bad credentials'); 
} 
?> 

Este módulo también está disponible para otros servidores web. Si mal no recuerdo, la idea viene originalmente de lighttpd, pero, como dice Josh, también está disponible para nginx.

1

En la solución de Jacco, ¿es posible inspeccionar los encabezados, encontrar la URL del archivo y descargarlo sin autenticación?

Una posible solución que se me ocurre sería colocar los archivos en un lugar que sea inaccesible para cualquier persona que no sea el navegador, es decir, utilizando un .htaccess denegar todo. Funcionaría eso?

+1

No, no lo es. El encabezado X-Sendfile se elimina, el archivo parece estar ubicado en la ubicación solicitada. Además, x-sendfile puede leer archivos que normalmente no son accesibles por la web – Jacco

Cuestiones relacionadas