Filtrar descargas atraves de PHP
By: Date: febrero 3, 2008 Categories: Consultoria y Manuales,Programación

Hoy recibí un E-Mail pidiendo un consejo al respecto de un problema de descargas

El email dice lo siguiente.

Hola David necesito una ayuda por favor

mira tengo mi Servidor de Full mp3 en directorios
Bueno en mi pagina solo se reproduce esa musica
ahora si yo miro el codigo de mi web, alli estan los archivo o los link o las rutas de donde
se encuentran los archivos mp3
verdad?

Bueno por ejemplo:

Ejemplo de ruta donde se encuentra el archivo

Ahora si yo copio y pego esa direccion en internet me descarga el archivo intro.mp3

Como puedo evitar esa descarga?
Asi sea que lo pege en internet explorer como en firefox o tambien que lo pege en el download accelerator o en otros
Gestores de desacarga?

En otras palabras restringir la descarga de ese fichero.

Y otra cosa tambien una ves ke se reproduce el archivo. veo que se kedan en los temporales de internet
Como puedo eliminar o ese archivo desde alli o talvez pueda codificar mi archivo para ke no lo copien desde
La carpeta de temporales a otra parte de su pc

Espero tu respuesta

Gracias

Atte ¿¿¿¿?????

——————-
Este correo ha sido enviado por el servidor de
Last Dragon y se considera limpio de Virus o SPAM

Mi respuesta es:

Para evitar revelar las rutas y ya que esto es un servicio en el WEB puedes apoyarte de PHP

Primero debes configurar tu servidor WEB para permitir ejecutar código en una extensión de archivo .mp3. Los archivos MP3 son flujos de datos, lo que significa que no tienes que descargar todo el archivo para oírlo, esto permite oír el archivo al vuelo, es decir escucharlo mientras este se descarga, esto hace más fácil lo que quieres hacer.

Una vez configurado el servidor, crea el archivo .MP3 y trátalo como un archivo .PHP

Dentro pondrás código de control, ya que PHP da control total sobre la información recibida por el cliente, puedes discriminar que hacer con ella.

Por ejemplo puedes detectar cuanto es tu plugin web el que se conecta para que se escuche la música en el WEB o cuando se trata de una descarga directa con otro programa como los que ya mencionaste en tu correo. Si detectas que se trata de una descarga directa, antes de enviar el flujo de datos, cancelas.

Dentro del código PHP puedes hacer que el archivo MP3 se descargue leyéndolo o con simple cat que es un comando en Linux para ver el contenido de un archivo, para este ejemplo yo use cat por que quería redactar rápidamente este articulo, la solución más elegante y desgasta menos los recursos del servidor es hacer una función PHP que te lea el archivo como si fuera el CAT del sistema.

Como ejemplo hice que el servidor permita códigos PHP en un archivo JPG y atreves de un archivo llamado imagen.jpg acceso a los demás archivos que en este caso son a y b, en el ejemplo a y b son leídos con un cat desde el mismo directorio donde esta el imagen.jpg, sin embargo igual podría poner los archivos a y b en un directorio fuera del acceso de apache por ejemplo /imágenes/a.jpg y con el cat accesar cat /imágenes/a.jpg, como ya te habrás imaginado, la única forma de accesar a estos archivos seria por el imagen.jpg que contiene código php y con esto pudiendo filtrar cualquier conexión que no cumpla con tus requisitos.

En mi ejemplo la condición es que solo puedan ser vistos con mi propio internet explorer, si no es mi internet explorer las imágenes no se mostraran y en su lugar darán un aviso, que solo con internet explorer pueden ser vistas.

23 thoughts on “Filtrar descargas atraves de PHP

  1. Internet Explorer 7.0 Windows Vista

    El codigo que use en imagen.jpg es el siguiente

    <?php

    $archivo = $_GET[“archivo”];

    if ($_SERVER[“HTTP_USER_AGENT”] == “Mozilla/4.0 (compatible; MSIE 7.0;
    Windows NT 6.0; (R1 1.5); SLCC1; .NET CLR 2.0.50727; Media Center PC
    5.0;)” )

    system (“cat “.$archivo);

    else {
    echo “Solo puedo ser visto por Internet Explorer”;
    exit ();
    }

    ?>

    El url usado fue

    https://www.lastdragon.net/misarchivos/streamphp/imagen.jpg?archivo=a.jpg y
    https://www.lastdragon.net/misarchivos/streamphp/imagen.jpg?archivo=b.jpg

    tu podrias usar http://server.com/archivo.mp3?musica=1 o
    http://server.com/archivo.mp3?musica=rabanes.mp3

    donde rabanes.mp3 seria un archivo que no puede ser alcanzado si no es atraves de archivo.mp3

  2. Opera 9.25 Windows Vista

    You don’t have permission to access /misarchivos/streamphp/imagen.jpg on this server.

    jeje creo que ya descubriste que hay un pequeño errorsillo en tu idea 😛 (si ese es el codigo final que usaste)

  3. Internet Explorer 7.0 Windows Vista

    La verdad es que no tengo idea de que error hablas, si fueras tan gentil de señalarme el error que aun no veo.

    El motivo por que no se tiene acceso al archivo es que no funcionaria ya que no quite la configuración de poner código dentro de un JPG, si le dieras click a ese archivo de imagen.jpg como realmente no es una imagen, se vería código PHP, y como ya no esta configurado para ejecutar código, realmente no le veo el riesgo ni el error.

    ¿Me puede señalar el error?

    e igual, si tienes una mejor idea, es un buen momento para exponerla, ya que hay gente interesada en el tema

  4. Debian IceWeasel 2.0.0.11 Debian GNU/Linux

    Tal vez se refiere al system(“cat $archivo”) que no sanitizas, te pueden meter muchas cosas por allí. Podrías usar readfile o fopen, fread. El system es mala idea, también lo es hacer que los .jpg se ejecuten como php, no? puedes usar index.php/foo.jpg en su lugar o mezclarlo con .htaccess.

  5. Internet Explorer 7.0 Windows Vista

    La del system estoy de acuerdo, de hecho, yo mismo cite eso

    yo use cat por que quería redactar rápidamente este articulo, la solución más elegante y desgasta menos los recursos del servidor es hacer una función PHP que te lea el archivo como si fuera el CAT del sistema.

    poner un tipo de archivo a ejecutar codigo como jpg o mp3, a mi parecer no es mala idea cuando el servidor se dedica a eso, tengo un par de configuraciones de ese tipo, hasta hoy nadie les ha podido meter un gol.

    Yo mas bien creo que marioly habla de algo en el codigo, tal vez algo esta mal en mi codigo pero son pocas lineas y por mas que lo leo no encuentro, pienso que tal vez es la forma en la que trato al AGENT, que veo que esta libre para un XXS o pero minimizo ese riesgo ya que se trata de una discriminacion y eso evitaria el XXS.

    He visto como programa Marioly, realmente veo que es buena en esos asuntos, por eso el hecho de que señale un error en algo que considero tan simple, tan basico, me ha hecho pensar bastante. ¿Donde rayos tengo el error?

  6. Internet Explorer 6.0 Windows XP

    Humm interensantisimo. pero creo que el punto de vista del autor 😀
    es que no se descarge ningun archivo tipo mp3 de su web,
    claro esta que quiere reproducir el archivo mediante un mp3 player
    o talvez me confundi? :S

    osea en conclusion. que reprodusca de mp3 player, pero que no sea descargado por otros
    directamente o que evite la descarga directa .

    Porque se supone que cada archivo que uno visita en internet . bueno pienso
    que la mayoria estaria en carpeta temporales de internet verdad?

    ………………..

  7. Internet Explorer 6.0 Windows XP

    Creo que yo le voy a dar una solucion mas facil al que solicito ayuda.

    Yo le recomiendo que baje un reproductor de MP3 en FLASH y PHP como Wimpy Player por ejemplo hay muchos (busquese en google).

    Por medio de un archivo SWF (que no muestran codigo) reprodusca sus mp3 alojados en cualquier carpeta (muy configurable), no le mostrara la ruta de los archivos y el .swf no le permitira la descarga del mp3 (amenos que se desee).

    Creo que la persona que escribio buscaba una respuesta mas sencilla para un usuario normal, recuerden que no todos son administradores de servidores y programadores… a veces lo mas sencillo es lo mas facil xD

  8. Opera 9.25 Linux

    Incluso creo que ese codigo es vulnerable a LFI , tal vez si agregaramos un archivo importante del wordpress pero lo tienes forbidden no creo que se pueda hacer algo al respecto. Porque puede ser vulnerable LFI ? , pues porque la variable no esta definida y le hace un cat a la variable sin saber su contenido. No tiene ningun tipo de filtro para saber que archivo es el que se esta incluyendo para hacer el cat creo que a eso se refiere Marioly , encuanto de lo del XSS ( es XSS porque la x se toma como una “c” las demas “s” son por site scripting ) en cuanto a lo de el agent no tiene nada vulnerable ya que nunca imprimes la variable.

  9. Internet Explorer 7.0 Windows Vista

    Psiczn

    Tienes toda la razon, en mi web no hay tanto problema

    El cat es una mala idea, aqui me atrevi a usarlo por que no es el cat del sistema, dentro de mi web hay un directorio de /bin donde tengo archivos del sistema pero con el setuid de otro usuario que no es el mismo con el que corre el apache, de esa manera controlo por permisos que archivo abre y que no mi directorio subbin en mi web.

    Aun con todo esto, debo admitir que fue una mala practica de programacion hacerlo. Si no fuera por la seguridad extra que le pongo a mi server ese codigo si seria malo especificamente seria malo

  10. Mozilla Firefox 2.0.0.11 Windows XP

    Y en caso de que sea como dice RucoSoft, como seria el code de ese archivo swf?
    y como seria la configuracion para que las personas, o los usurios o visitantes no descargen los archivos
    Mp3 del Servidor, ya que ese es el primero objetivo que se desea hacer.

    Bueno esta en que debe reproducir la web el archivo de musica pero que no se pueda descargar por otras personas

    Gracias espero su respuesta

  11. Internet Explorer 7.0 Windows Vista

    Es mas fácil como dice RucoSoft pero nunca lo he hecho, si fuera mi caso, lo habría hecho tal y como ya describí. Tal vez ruco pueda ondear en el tema. O dar una pista de que descargar o que hay que hacer.

  12. Mozilla Firefox 2.0.0.11 Windows XP

    Aunque se usara flash para reproducir los mp3, es demaciado facil bajarlos con un simple plugin de firefox, sin entrar a ninguna carpeta ni mirar el codigo fuente, basta presionar un boton y listo.

  13. Internet Explorer 7.0 Windows XP

    Evitar la descarga de un archivo mp3 a la carpeta temporal de internet explorer hasta ahora no lo eh logrado … usar cat para leer archivos es una salida pero lo que yo hago es encriptar mi reproductor hecho en flash .. y hacer que mi lista de canciones (xml) que no se descargue en los temporales …

    Ese es el codigo en php que uso al hacer el listado de canciones (xml) para que no se descargue la lista en los temporales

    ojala les sirva de ayuda…

  14. Mozilla Firefox 2.0.0.11 Windows XP

    La cosa con el metodo que dice ruco, es que por ejemplo con el firebug en firefox no sería dificil ver que archivo carga el swf, y por lo tanto sacar la url del mp3 es cosa facil.

    Lo digo pq ultimamente he estado trabajando con swf y con firebug debugeo cuando algun archivo no me carga =P

  15. Safari 523.15 Mac OS

    Bueno en realidad todos sabemos que si podemos escuchar el mp3, siempre encontraremos una buena forma de descargarlo, supongo que lo que ella quería era ocultarlo un poco…

    aquí esta el script del wimpy para que lo chequen…

    pero tienen razón… siempre hay plugins de firefox, o simplemente decompilando el archivo .swf veremos el código, despues buscamos los xml con la información encontraremos en donde se encuentran los mp3

    http://rapidshare.com/files/92220206/wimpy.zip.html

    de todas maneras envienselo a la persona que escribió el correo, de algo le servirá…

  16. Mozilla Firefox 2.0.0.12 Windows XP

    Cosas como esta es la que les da un mal nombre al php. Usar system, y pasarle un atributo directamente que viene del usuario sin hacerle ningun tipo de filtrado, ¿porque no dar acceso ftp a todos mejor?. Otra cosa que es mala idea, ¿solo verificar el USER AGENT? Luego dicen ‘php es inseguro!’, tantas funciones que tiene php para leer archivos: file_get_contents(), file(), fopen(), fgets(), readfile(), etc. Teniendo en cuenta claro filtrar el parametro del nombre del archivo, para evitar que usuarios malintencionados lean archivos que no sean permitidos, por ejemplo:
    http://www.server.com/file.php?a=/etc/passwd
    http://www.server.com/file.php?a=./../../../config.php
    etc.

    Te pido que elimines o arregles ese codigo que tienes alli, para evitar que alguien que no conozca de php lo use.

  17. Internet Explorer 7.0 Windows Vista

    Benford, ¿que parte de el siguiente parrafo en el articulo
    no entendiste?

    Dentro del código PHP puedes hacer que el archivo MP3 se descargue leyéndolo o con simple cat que es un comando en Linux para ver el contenido de un archivo, para este ejemplo yo use cat por que quería redactar rápidamente este articulo, la solución más elegante y desgasta menos los recursos del servidor es hacer una función PHP que te lea el archivo como si fuera el CAT del sistema.

    Tambien lee mi respuesta numero 9

    Yo puedo darme el lujo de hacer lo que para el resto del mundo
    es una inseguridad, yo puedo darme esos lujos por que controlo al
    100% mi propio servidor, en mi propio enlace dedicado, no es un
    simple hosting.

    Admito que ese codigo es inseguro en un servidor X, en mi servidor
    es completamente inofensivo.

    Puedes leer que tan seguro es mi server que incluso se
    negaria a ejecutar algun xploit en este URL

    https://www.lastdragon.net/?p=230

  18. Mozilla Firefox 2.0.0.12 Windows XP

    Bueno, no te conozco, ni me importa quién sos, pero varias cosas, si le estás dando una solución a un problema que alguién con pocos conocimientos sobre PHP, ¿Para qué le metes un código vulnerable?, ya está discutido lo del system(), y es muy mala práctica, no se habla de si tu servidor es seguro o no, se habla de quién vaya a utilizar esa mierda de código.
    Y hablando de soluciones elegantes y códigos aque desgastan menos los recursos, porque en vez de poner “echo ..;exit()”; no pones die(‘..’); también es mala práctica usar dobles comillas para recibir datos…

    En fin, es una crítica constructiva, tomalo como queras, y reconsidera lo que haces, porque es un mal trabajo…

  19. Mozilla Firefox 2.0.0.12 Mac OS

    Buenas tardes, miren pues no se pero para mi gusto sería mejor manejarlo sencillito con una db que contenga los nombres de archivo y pues el mime type y el tamaño solo para tenerlos de referencia y despues hacer un php que nos consulte la db y nos regrese el archivo, lo cual evitaría mostrar la ruta del archivo pero el PHP tendría que comprobar que vienen de la web que uds quieren y no hayan introducido la dirección por medio de la barra de direcciones.

    Si esto cumple sus espectativas espero se puedan poner en contacto conmigo y lo desarrollamos si lo necesitan.

    Saludos

    Roberto C.

    Ahh. PD mi msn chaguerogui@hotmail.com

  20. Mozilla Firefox 2.0.0.1 Windows XP

    mmm… no entendi naa, pero necesito saber como hacer q la musica q alojo en un servidor externo, no sea descargado, q solo pueda ser reproducida de modo streaming. xd … q la respuesta sea como para un novato. xd

  21. Mozilla Firefox 3.5.8 Windows XP

    hola disculpa yo tengo un mp3 player con una lista en xml, pero no se como se puede realizar con get o con post en php, es decir que ellos me enviaran una id o una variable de una pagina y como la cacho y la muestro en mi mp3 player. saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *