Foros del Web » Programando para Internet » PHP »

Seguridad para no acceder a ver archivos?

Estas en el tema de Seguridad para no acceder a ver archivos? en el foro de PHP en Foros del Web. Hola tengo una area de clientes donde con una Clave y Contraseña el usuario entra a una pagina donde puede ver facturas y presupuestos en ...
  #1 (permalink)  
Antiguo 18/06/2008, 01:39
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Seguridad para no acceder a ver archivos?

Hola

tengo una area de clientes donde con una Clave y Contraseña el usuario entra a una pagina donde puede ver facturas y presupuestos en formato .pdf. (haciendo clic sobre sus enlaces)

Una vez que el usuario hace la entrada guardo sus datos (clave y contraseña) en una var $_SESSION[] lo cual es chequeado cada vez que cambia de página. Hasta aquí sin problema.

Cuando el usuario hace clic para ver un pdf, este se abre en el explorador. Y aquí está mi problema, porque si yo copio la ruta a ese pdf (por ejemplo: www.mipagina.com/clientes/documentos/unPdf.pdf ) y cierro el explorador ( para destruir la session) y lo vuelvo a abrir y pego la ruta en la barra de direcciones, PUEDO ACCEDER AL PDF.

Se puede solucionar esto?. O sea: que no se pueda abrir el pdf si la session no está creada.

gracias
  #2 (permalink)  
Antiguo 18/06/2008, 01:50
 
Fecha de Ingreso: octubre-2004
Mensajes: 2.627
Antigüedad: 19 años, 6 meses
Puntos: 48
Respuesta: Seguridad para no acceder a ver archivos?

Lo que tienes que hacer es que el pdf no sea accesible directamente, sino que siempre sea un script PHP. Es decir, que para ver el pdf la ruta sea dominio.com/facturas/ver.php?pdf=unpdf.pdf . Puedes hacerlo guardando los ficheros pdf en una carpeta no accesible via web, configurando el servidor para que no acepte peticiones de ese tipo de ficheros en esa carpeta, configurando los permisos de los ficheros, etc. Todo a nivel de servidor web y sistema operativo.

Luego si quieres puedes usar en apache mod_rewrite para que la url dominio.com/facturas/unpdf.pdf sea traducido internamente por apache a dominio.com/facturas/ver.php?pdf=unpdf.pdf .
  #3 (permalink)  
Antiguo 18/06/2008, 03:07
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Respuesta: Seguridad para no acceder a ver archivos?

gracias darkJ
veré como hacer lo que me dices.
  #4 (permalink)  
Antiguo 18/06/2008, 08:12
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Respuesta: Seguridad para no acceder a ver archivos?

estoy tratando de entederlo pero no lo pillo

tengo la pagina donde esta el form (que es una pagina a la que no puede ingresar si no ha echo el login)


En 'misDocs/' tengo:
Pdf1.pdf
Pdf2.pdf

'pagina1.php' (tiene el formulario)

<form action="verDoc.php" method="GET" >
<input type="hidden" name="nombrePdf" value="Pdf1.pdf" >
<input type="submit" value="Descargar" >
</form>

luego en 'verDoc.php' pondría un link:

<a href="misDocs/<?php echo $_GET['nombrePdf']; ?>">bajar pdf</a>

Supongo que no lo estoy haciendo bien porque sigo teniendo el mismo problema.
Al hacer clic sobre el enlace 'bajar pdf' navega hasta el la ubicacion y la direccion queda guardada en el historial del explorador y accesible por cualquier persona.
  #5 (permalink)  
Antiguo 18/06/2008, 08:20
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Respuesta: Seguridad para no acceder a ver archivos?

La carpeta que tiene los pdf tiene configurado Owner: 'miPagina' y Group:'miGrupo'
Supongo que esto tiene algo con la seguridad y que me ayudaría a hacer lo que necesito? Alguna pista

gracias
  #6 (permalink)  
Antiguo 18/06/2008, 09:18
Avatar de Carlojas  
Fecha de Ingreso: junio-2007
Ubicación: Shikasta
Mensajes: 1.272
Antigüedad: 16 años, 10 meses
Puntos: 49
Respuesta: Seguridad para no acceder a ver archivos?

Hola chefnelone, cambia los permisos al directorio donde alojas tus PDF, puedes hacerlos via un cliente FTP directamente si ya tienes la web en el hosting o utilizando la función de PHP chmod()



Saludos.
  #7 (permalink)  
Antiguo 18/06/2008, 11:23
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Respuesta: Seguridad para no acceder a ver archivos?

Gracias Carlojas.
No he podido. Que me está faltando hacer?

La carpeta tenía los permisos a 777. (rwxrwxrwx)

he probado cambiandolos a 770 (rwxrwx---) pero entonces no me deja bajar los archivos

La carpeta tiene configurado:
Owner 'miPagina'
Group 'miGrupo'

que me está faltando hacer??
  #8 (permalink)  
Antiguo 19/06/2008, 01:22
 
Fecha de Ingreso: octubre-2004
Mensajes: 2.627
Antigüedad: 19 años, 6 meses
Puntos: 48
Respuesta: Seguridad para no acceder a ver archivos?

Cita:
luego en 'verDoc.php' pondría un link:

<a href="misDocs/<?php echo $_GET['nombrePdf']; ?>">bajar pdf</a>
No, mientras dejes un link directo al fichero nunca vas a poder evitarlo.

Haz que verDoc.php devuelva el fichero pdf, algo como:
Código PHP:
<?php

// AQUI IRIA TU CODIGO DE VALIDACION DE LOGIN
// SI NO ESTA LOGEADO LE REDIRECCIONAS A LA PAGINA APROPIADA


// We'll be outputting a PDF
header('Content-type: application/pdf');

// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// The PDF source is in original.pdf
readfile('original.pdf');
?>
(de www.php.net/header).
  #9 (permalink)  
Antiguo 19/06/2008, 05:04
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Respuesta: Seguridad para no acceder a ver archivos?

Ya casi lo tengo... pero lo que hace es bajar doc.php ?? Donde le estoy errando

el archivo que tiene que bajar esta en:
../clientesGestor/ClientsDocs/pag web.pdf

este es el codigo.

documentos2.php
Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
</head>
<body>
<form action="verDoc.php" method="GET" >
<input type="hidden" name="nombrePdf" value="../clientesGestor/ClientsDocs/pag web.pdf" >
<input type="submit" value="Descargar" >
</form>
</body>
</html>
y el verDoc.php:
Código:
<?php
//*We'll*be*outputting*a*PDF 
header('Content-type: application/pdf'); 
//*It*will*be*called*downloaded.pdf 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 
//*The*PDF*source*is*in*original.pdf 
readfile('original.pdf'); 
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
</head>
<body>
</body>
</html>

Última edición por chefnelone; 19/06/2008 a las 05:11
  #10 (permalink)  
Antiguo 19/06/2008, 05:31
 
Fecha de Ingreso: mayo-2005
Mensajes: 188
Antigüedad: 19 años
Puntos: 6
Respuesta: Seguridad para no acceder a ver archivos?

Lo primero: ¿Por qué has incluido el readfile tal cual? ¿Acaso el fichero que quieres bajar se llama "original.pdf"? Lo que debes hacer es sustituir el nombre del fichero original.pdf por el valor del parámetro recibido: readfile($_GET['nombrePdf'])

Además, el contenido enviado es el propio PDF, no debes incluir NADA de HTML en verDoc.php. Todo lo que has añadido después del readfile() sobra.

Espero que ahora sí funcione. ;)
  #11 (permalink)  
Antiguo 19/06/2008, 05:34
 
Fecha de Ingreso: mayo-2005
Mensajes: 188
Antigüedad: 19 años
Puntos: 6
Respuesta: Seguridad para no acceder a ver archivos?

Otra cosa: Personalmente el formulario lo enviaría por POST en lugar de GET. Estás ocultando la ruta real al fichero PDF definiendo el campo nombrePdf como hidden. Sin embargo, al enviar el formulario como GET el nombre del fichero aparecerá en la URL, por lo que el usuario podrá verlo sin problemas.

Pero esto ya queda como sugerencia...
  #12 (permalink)  
Antiguo 19/06/2008, 06:21
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Respuesta: Seguridad para no acceder a ver archivos?

cambios hechos pero sigue descargando 'verDoc.php' en lugar de 'pagweb.pdf'

he probado con GET y con POST ( pero descarga verDoc.php de todas formas)

codigo:

documentos2.php
Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
</head>
<body>
<form action="verDoc.php" method="POST" >
<input type="hidden" name="nombrePdf" value="pagweb.pdf" >
<input type="submit" value="Descargar" >
</form>
</body>
</html>
verDoc.php
Código:
<?php
header('Content-type: application/pdf'); 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 
readfile($_POST['nombrePdf']);
?>
  #13 (permalink)  
Antiguo 19/06/2008, 06:29
 
Fecha de Ingreso: mayo-2005
Mensajes: 188
Antigüedad: 19 años
Puntos: 6
Respuesta: Seguridad para no acceder a ver archivos?

Qué quieres decir con que te descarga verDoc.php? El contenido que te guarda no es el del PDF? O te guarda el PDF pero con el nombre verDoc??
  #14 (permalink)  
Antiguo 19/06/2008, 07:15
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Respuesta: Seguridad para no acceder a ver archivos?

que me descarga un archivo que se llama verDoc.php
Cuando lo intento abrir tiene caracteres raros (nada claro)

Yo creo que está bajando el pdf pero lo renombra a verDoc.php y al cambiarle la extension ya no es posible visualizarlo correctamente.
  #15 (permalink)  
Antiguo 19/06/2008, 11:42
 
Fecha de Ingreso: mayo-2005
Mensajes: 188
Antigüedad: 19 años
Puntos: 6
Respuesta: Seguridad para no acceder a ver archivos?

Cita:
Iniciado por chefnelone Ver Mensaje
Yo creo que está bajando el pdf pero lo renombra a verDoc.php y al cambiarle la extension ya no es posible visualizarlo correctamente.
En principio con el código que tienes debería estar bajando el PDF, pero con el nombre "downloaded.php", tal y como lo tienes en la cabecera "content-disposition".

He probado el código (exacto, lo he copiado de aquí) y a mi me funciona correctamente, tanto con Ffox como con IE.

Para indicar el nombre del fichero de descarga, puedes modificar la cabecera:

Código PHP:
$filename basename($_POST['nombrePdf']);
header('Content-Disposition: attachment; filename="' $filename '"'); 
Como te digo, esto me está funcionando perfectamente
  #16 (permalink)  
Antiguo 19/06/2008, 12:53
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Respuesta: Seguridad para no acceder a ver archivos?

el código lo he copiado y pegado tal cual lo tengo en mi servidor...
no tengo ni idea que puede ser.
Puede ser algo que tenga que ver con la configuarcion de mi hosting??
  #17 (permalink)  
Antiguo 19/06/2008, 14:42
Avatar de Tombar  
Fecha de Ingreso: junio-2008
Ubicación: /home/tombar
Mensajes: 198
Antigüedad: 15 años, 10 meses
Puntos: 11
Respuesta: Seguridad para no acceder a ver archivos?

yo lo haria de la siguiente forma

cuando el usuario quiere acceder a ver un pdf le daria una ruta del tipo

www.midomino.com/sarasa/pdfviewer.php?i=pdf

en ese pdfviewer usaria tu codigo para cheqeuar que tena la session activa y luego enviaria un header mime con la info de que es un pdf y el pdf atras, ya hay funciones para hacer esto por la vuelta.

te aconsejo no te compliques con modrewrite en este caso.
  #18 (permalink)  
Antiguo 20/06/2008, 02:05
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Respuesta: Seguridad para no acceder a ver archivos?

gracias tombar, me darias una pista para hacer el pdfviewer.php
  #19 (permalink)  
Antiguo 20/06/2008, 03:33
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Respuesta: Seguridad para no acceder a ver archivos?

ya funciona gracias a todos!!
  #20 (permalink)  
Antiguo 20/06/2008, 08:39
Avatar de Tombar  
Fecha de Ingreso: junio-2008
Ubicación: /home/tombar
Mensajes: 198
Antigüedad: 15 años, 10 meses
Puntos: 11
Respuesta: Seguridad para no acceder a ver archivos?

Como lo hicistes al final?
  #21 (permalink)  
Antiguo 23/07/2008, 11:05
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Respuesta: Seguridad para no acceder a ver archivos?

recogiendo los datos asi:
<?php

header('Content-type:application/pdf');


$filename = basename($_POST['nombrePdf']);
header('Content-Disposition: attachment; filename="' . $filename . '"');


readfile($_POST['nombrePdf']);
?>
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 21:54.