Foros del Web » Programando para Internet » PHP »

Acceso publico a archivo que deberían ser privados

Estas en el tema de Acceso publico a archivo que deberían ser privados en el foro de PHP en Foros del Web. Hola a todos, tengo una duda que no termino de encontrar la solución en internet, tal vez porque no exista. He creado una web de ...
  #1 (permalink)  
Antiguo 25/08/2014, 17:51
 
Fecha de Ingreso: diciembre-2013
Mensajes: 37
Antigüedad: 10 años, 11 meses
Puntos: 1
Acceso publico a archivo que deberían ser privados

Hola a todos, tengo una duda que no termino de encontrar la solución en internet, tal vez porque no exista.

He creado una web de aprendizaje que tiene un acceso público y otro privado. El privado tiene acceso a unos Pdf´s, que están alojados en una carpeta (llamada pdf) de mi servidor.
Supongamos que la dirección de mi web es:

www.ejemplo.es

Si accedo al perfil privado sin estar registrado, o sea un perfil público, no se mostraría nada porque detecta que no está la cookie de usuario registrado y redirige al perfil público. Ejemplo:

www.ejemplo.es/pdf.php

Pero si hiciese esto:

www.ejemplo.es/pdf/1.pdf

Me descargaría el pdf sin estar registrado ya que no hay comprobación de la cookie de sesión.
¿Qué se os ocurre que puedo hacer para proteger esos datos privados?
  #2 (permalink)  
Antiguo 25/08/2014, 23:00
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Acceso publico a archivo que deberían ser privados

Lo primero sería evitar revelar la ruta del PDF, mucho mejor si queda fuera de la ruta web.

Normalmente te asignan un espacio en el hosting para tu web, incluyendo servicios (correos, estadísticas, etc.), digamos que es algo como /home/usuario y dentro encuentras directorios:

- mail
- tmp
- public_html

En public_html es donde se guardan todos los documentos de tu web y sería conveniente crear la carpeta pdf en el mismo nivel, quedando automáticamente inaccesible desde URL

Después solo necesitas hacer un script de descarga donde verifiques que el usuario inició sesión y después envías el PDF al navegador usando readfile()
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 26/08/2014, 08:22
 
Fecha de Ingreso: diciembre-2013
Mensajes: 37
Antigüedad: 10 años, 11 meses
Puntos: 1
Respuesta: Acceso publico a archivo que deberían ser privados

Cita:
Iniciado por Triby Ver Mensaje
Lo primero sería evitar revelar la ruta del PDF, mucho mejor si queda fuera de la ruta web.

Normalmente te asignan un espacio en el hosting para tu web, incluyendo servicios (correos, estadísticas, etc.), digamos que es algo como /home/usuario y dentro encuentras directorios:

- mail
- tmp
- public_html

En public_html es donde se guardan todos los documentos de tu web y sería conveniente crear la carpeta pdf en el mismo nivel, quedando automáticamente inaccesible desde URL

Después solo necesitas hacer un script de descarga donde verifiques que el usuario inició sesión y después envías el PDF al navegador usando readfile()
Gracias por contestar, Triby.
Efectivamente tengo los directorios siguientes:

-log
-public_ftp
-etc
- mail
- tmp
- public_html

Mi archivos php, js, css los tengo metidos todos en public_html. No sé si será lo más correcto, pero como tengo sólo 20 archivos lo dejé así.

Dentro de public_html creé las carpetas:

IMAGES, para las imagenes de mi web y
ARCHIVOS, para los pdf.

Está claro que la ruta de los archivos no se ve en ningún lado de mi web, salvo el que está registrado que sí puede verla. Además creé varios tipos de registro, con lo cual uno registrado de nivel 1 no puede descargar lo de nivel 2 ni viceversa.
Lo que pasa es que todo esto no me vale para nada si cualquier persona pone la ruta en el navegador directamente, bien porque le de por probar y acierte o bien porque la sepa y quiera descargar sin logearse.

Como no entiendo tu respuesta te he puesto el esquema completo de mi web a ver si me explico mejor así. Un besito enorme.
  #4 (permalink)  
Antiguo 26/08/2014, 12:53
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 6 meses
Puntos: 528
Respuesta: Acceso publico a archivo que deberían ser privados

Es simple, todo lo que esté fuera de tu carpeta public_html no se podrá acceder a menos que hagas un script que lo permita, por ejemplo, podrías crear una carpeta "files" en tu esquema:


-log
-public_ftp
-etc
-files
- mail
- tmp
- public_html

Y para acceder a lo contenido en esta carpeta debes crear un script, por ejemplo:
descargas.php
Código PHP:
Ver original
  1. <?php
  2. //código para validar si el usuario tiene o no permiso-------
  3.  
  4. $file="/home/tuusuario/files/archivo.pdf";
  5.  
  6. if($usuario_valido){
  7.    header('Content-type: application/octet-stream');//header para indicar la descarga del archivo
  8.    header("Content-length: " . filesize($file)); //header para indicar tamaño del archivo
  9.    header('Pragma: no-cache');//que no cachee el archivo
  10.    readfile($file);//Mandamos el contenido del archivo
  11. }

Puedes mejorar el esquema, por ejemplo creando enlaces temporales para que no puedan descargar los archivos después de cierto tiempo, y otros tipos de validaciones.
  #5 (permalink)  
Antiguo 26/08/2014, 14:48
 
Fecha de Ingreso: diciembre-2013
Mensajes: 37
Antigüedad: 10 años, 11 meses
Puntos: 1
Respuesta: Acceso publico a archivo que deberían ser privados

Cita:
Iniciado por ocp001a Ver Mensaje
Es simple, todo lo que esté fuera de tu carpeta public_html no se podrá acceder a menos que hagas un script que lo permita, por ejemplo, podrías crear una carpeta "files" en tu esquema:


-log
-public_ftp
-etc
-files
- mail
- tmp
- public_html

Y para acceder a lo contenido en esta carpeta debes crear un script, por ejemplo:
descargas.php
Código PHP:
Ver original
  1. <?php
  2. //código para validar si el usuario tiene o no permiso-------
  3.  
  4. $file="/home/tuusuario/files/archivo.pdf";
  5.  
  6. if($usuario_valido){
  7.    header('Content-type: application/octet-stream');//header para indicar la descarga del archivo
  8.    header("Content-length: " . filesize($file)); //header para indicar tamaño del archivo
  9.    header('Pragma: no-cache');//que no cachee el archivo
  10.    readfile($file);//Mandamos el contenido del archivo
  11. }

Puedes mejorar el esquema, por ejemplo creando enlaces temporales para que no puedan descargar los archivos después de cierto tiempo, y otros tipos de validaciones.
Gracias, ocp001a tanto por tu pieza de código como por tu explicación e ideas nuevas que me has dado. Es increible lo que se puede ir haciendo poco a poco mientras se aprende. Pondré en práctica la solución este fin de semana y postearé el resultado. Un beso

Etiquetas: privados, publico
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:00.