Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Mr. Crowley en 29 Noviembre 2009, 04:56 am



Título: Evitar descarga de archivos si el usuario no esta logueado
Publicado por: Mr. Crowley en 29 Noviembre 2009, 04:56 am
Saludos  ;D

Tengo un sitio donde se le permite hacer descargas a los usuarios registrados. Si el
usuario se ha logueado tiene acceso a la pagina de descargas, donde estan los links
de los archivos que puede bajarse. Ejemplo de un link: http://www.examples.com/archivo.rar

Quiero evitar que un usuario le pase ese link a otra persona... y que pueda descargar
el contenido que es solo para miembros. Necesito hacer una verificacion, y no se como
funciona.

Algo asi: cuando se pone el link en el navegador, la pagina o el servidor web (no se
quien tenga que hacerla)... verifica que el usuario este logueado; si lo esta entonces
se puede bajar el archivo, si no, entonces se le muestra un mensaje diciendole que se registre en el sitio.

Que tan complicado es esto? Se que se puede hacer, si alguien puede guiarme se lo
agradezco  :P


Título: Re: Evitar descarga de archivos si el usuario no esta logueado
Publicado por: WHK en 29 Noviembre 2009, 09:03 am
Hla puedes hacer un archivo .htaccess y un .htpasswd para crear un nombre de usuario y contraseña pero lo malo es que si quieres cambiar el usuario tendrás que cambiar el archivo y no es muy productivo :-/

Lo otro que puedes hacer es obtener el archivo desde un php, o sea test.php?archivo=test.rar y entonces el php dirá fopen() a test.rar (cuidado con los retrocesos de directorio ../ ) y le vas haciendo echo al contenido que te vaya devolviendo el fread y recuerda no abrirlo completamente de una sola ves, o sea... cuando haces fread() le indicas el manipulador (handle) y la cantidad de carácteres que desea obtener del archivo, por lo general muchos utilizan filesize por lo tanto obtiene todo el archivo de una sola ves, si el archivo es muy grande entonces php no podrá cargar todo en memoria y dará error, por o tanto te recomiendo que le hagas un while de a 1024 carácteres y vas lanzando echo inmediatamente, luego cuando termine el while le haces fclose y exit; para que el resto de la web no intervenga en el contenido del archivo y de cabezera le pones que el tipo de archivo es ocet-stream para forzar al explorador su descarga.

Saludos.


Título: Re: Evitar descarga de archivos si el usuario no esta logueado
Publicado por: gabonix en 29 Noviembre 2009, 21:42 pm
O tambien puedes poner un simple codigo PHP en el header de tu pagina para que no ingrese si no esta logeado

if($usuarioRegistrado == true) {
     
      $name = $_GET['file'];
      header("Content-disposition: attachment; filename=$name");
      header("Content-type: application/octet-stream");
      readfile($directorio.'/'.$name);
 
   } else {
 
      echo "solo los usuarios registrados pueden descargar archivos";
   }

saludos :)


Título: Re: Evitar descarga de archivos si el usuario no esta logueado
Publicado por: Mr. Crowley en 30 Noviembre 2009, 01:22 am
Hola, gracias a ambos. No se me habia ocurrido pasar el archivo por variable. Que les
parece si hago algo asi:

1. Coloco todos los archivos disponibles para descargar en la carpeta DESCARGAS (ejemplo)
2. El link para descargar un archivo seria: pagina.php?strArtchivo=Nombre_De_Archivo

En ese caso nadie sabra donde guardo los archivos, entonces siempre van a tener que
estar registrados para poder hacer la descarga...

Lo siguiente seria implementar lo que me dice gabonix.

Código
  1. if($usuarioRegistrado == true) {
  2.     $directorio="DESCARGAS";
  3.      $name = $_GET['strArchivo'];
  4.      header("Content-disposition: attachment; filename=$name");
  5.      header("Content-type: application/octet-stream");
  6.      readfile($directorio.'/'.$name);
  7.  
  8.   } else {
  9.  
  10.      echo "solo los usuarios registrados pueden descargar archivos";
  11.   }
  12.  

Gracias!  ::)


Título: Re: Evitar descarga de archivos si el usuario no esta logueado
Publicado por: Mr. Crowley en 5 Enero 2010, 22:28 pm
Hola de nuevo... me funciono a la perfeccion el codigo en Firefox, Safari y Opera; pero
sucede que el Internet Explorer Intershit Explorer no descarga el archivo, lo que
intenta descargar es la pagina que contiene las descargas  :(

Osea, tengo una pagina "descargas.php" a la que le paso el archivo que quiero bajar.
Un ejemplo seria: "descargas.php?archivo=loquesea.rar"

Ahi valido si el usuario inicio una sesion o no, si esta iniciada entonces le permito
descargar el fichero, sino es redireccionado a otra pagina.

Internet Explorer intenta descargar la pagina "descargas.php", y no el archivo, como lo
hacen los otros browsers. Que podra ser? La prueba la hice con IE6.