Foros del Web » Programando para Internet » PHP »

Ocultar imágenes y pdf a los usuarios

Estas en el tema de Ocultar imágenes y pdf a los usuarios en el foro de PHP en Foros del Web. Hola a todos: Tengo un problemilla a ver si me lo podéis solucionar. Estoy haciendo una web con php que tiene diferentes usuarios. Según la ...
  #1 (permalink)  
Antiguo 08/03/2007, 05:51
 
Fecha de Ingreso: enero-2002
Ubicación: Cádiz, España
Mensajes: 96
Antigüedad: 22 años, 4 meses
Puntos: 0
Ocultar imágenes y pdf a los usuarios

Hola a todos:

Tengo un problemilla a ver si me lo podéis solucionar. Estoy haciendo una web con php que tiene diferentes usuarios. Según la entrada del usuario podrá ver una serie de fotos o pdf. Cuando estas activo te salen las imágenes de tu usuarios y una serie de PDF

Todos estos recursos están en la web, pero claro, si un usuario es un poco listo, puede ver la ruta de las imágenes y pdfs y poder acceder vía web directamente

Para ello creo que tengo dos opciones:

1. Que no se puedan acceder a los recursos directamente así:

http://www.dominio.com/fotos/archivo.jpg

pero si desde la web. No se si existe algo como esto. Sería una especie de "antilink" que tampoco he usado nunca pero no es exactamente lo que busco

2. Sacar el directorio de la ruta web y con PHP acceder a los recursos. Pero ¿esto lo podría hacer con los PDFs y no se si con las imágenes? Podría crear un archivo PHP que acceda al recurso y me comprueba si tiene permisos.

Prefiero la primera opción que será más cómodo, pero no se si existe la posibilidad

¿alguien me puede ayudar?

gracias
__________________
http://www.javielinux.com
  #2 (permalink)  
Antiguo 08/03/2007, 07:01
Avatar de carlosmbrizuela  
Fecha de Ingreso: enero-2007
Ubicación: La Plata (Argentina)
Mensajes: 490
Antigüedad: 17 años, 3 meses
Puntos: 1
Re: Ocultar imágenes y pdf a los usuarios

LO que puedes hacer es preguntar por el tipo de usuario.
If (es admin)
{mostras las img y los pdf}

saludos
__________________
http://www.rollermountain.com
  #3 (permalink)  
Antiguo 08/03/2007, 08:27
 
Fecha de Ingreso: enero-2002
Ubicación: Cádiz, España
Mensajes: 96
Antigüedad: 22 años, 4 meses
Puntos: 0
Re: Ocultar imágenes y pdf a los usuarios

me parece que no me he explicado bien

Mi problema es que cualquier usuario puede acceder directamente a los recursos poniendo la URL en el navegador. Poniendo la ruta del JPG. Ahí no puedo programar nada a no ser que exista algún módulo de apache o algo así que controle este tema.

¿alguien sabe que puedo hacer?
__________________
http://www.javielinux.com
  #4 (permalink)  
Antiguo 08/03/2007, 10:19
Avatar de ElJavista
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: Lima Perú
Mensajes: 2.231
Antigüedad: 17 años, 2 meses
Puntos: 67
Re: Ocultar imágenes y pdf a los usuarios

Bueno, estás intentando impedir que los usuarios puedan ver las fotos y bajarse los pdf sin necesidad de que entren a tu página. Bien, no entiendo para qué quieres evitar eso. Si de todas maneras se almacena en la archivos termporales de internet todo lo que uno va viendo en la web. La respuesta es simple, directa y contundente. No se puede, mejor olvídalo que ningún mal te hacen entrando a ver la imagen o el pdf directamente. Fíjate que el google mismo facilita esa labor, cuando alguien busca imagenes, al final las muestra solas.
  #5 (permalink)  
Antiguo 08/03/2007, 10:45
Avatar de ebe
ebe
 
Fecha de Ingreso: marzo-2004
Ubicación: Guatemala
Mensajes: 363
Antigüedad: 20 años, 1 mes
Puntos: 11
Re: Ocultar imágenes y pdf a los usuarios

La opcion de poner tus documentos fuera de DOCUMENT ROOT de tu web es muy practica y viable(con que tambien podrias hacerlo incluyendo un .htaccess en tu carpeta que contiene tus archivos, algo que podria llevarte a doble logeo... tedioso.) (yo lo he hecho para prevenir acceso directo a PDF's), ademas (no se de donde sacas los enlaces o los pdfs, una base de datos?) si lo unico (suponiendo que estan en una BBDD) que guardas en tu BBD son los las URL de la ubicacion de la imagen o el nombre de la imagen a la hora de listas estos contenidos (en un for o while imagino) puedes hacer uso de $_SERVER['DOCUMENT_ROOT']./../micarpetaconlosarchivos/nombredelarchivo
para referenciarlos fuera del document root.

tambien otra opcion seria guardas los archivos con nombres serializados (codificados, logicamente referenciandolos en tu bbdd con un id unico.).. despues de ahi.. quien va quere ponerse a averiguar los nombres de los archivos???

un saludo.
__________________
http://dev.wsnetcorp.com
  #6 (permalink)  
Antiguo 08/03/2007, 11:20
 
Fecha de Ingreso: enero-2002
Ubicación: Cádiz, España
Mensajes: 96
Antigüedad: 22 años, 4 meses
Puntos: 0
Re: Ocultar imágenes y pdf a los usuarios

Vamos a ver. Quiero tener los archivos inaccesibles ya que los archivos sólo los pueden ver los usuarios logados y que puedan ver esos archivo.

Tengo una base de datos con dos tablas. Una usuarios y otroa imágenes. Están vinculadas de la forma que una imagen pertenece a un usuario. Yo quiero que sólo la puede ver el usuario. ¿que pasa? Pues como las imágenes al subirla se le pone un nombre correltivo

0000000001.jpg
0000000002.jpg
0000000003.jpg
.....

pues el que vea el nombre puede ir al navegador y ver una imagen de otro usuario, cosa que no está nada bien.

Mediante un archivo PHP puedo acceder a una ruta que está fuera del directorio root, pero sólo lo he hecho para descargar pdfs. Y si se puede hacer. Supongo que será lo mismo para una imagen que quiera ver en una página

bueno, lo comprobaré. Lo que pasa que es un poco tedioso pero bueno. Yo quería saber si se podía hacer que no se dejase ver las imagenes directamente poniendo la ruta en el navegador

seguiré investigando
__________________
http://www.javielinux.com
  #7 (permalink)  
Antiguo 08/03/2007, 12:39
Avatar de ebe
ebe
 
Fecha de Ingreso: marzo-2004
Ubicación: Guatemala
Mensajes: 363
Antigüedad: 20 años, 1 mes
Puntos: 11
Re: Ocultar imágenes y pdf a los usuarios

SI descargas de PDF's seria diferente ya que envias las header directamente al navegador de lo que se va a visualizar, y si quieres lo descargas on lo muestras inline.

Ahora lo que se me ocurrre con las imagenes es guardar el nombre de la imagen (ya sabiendo previamente en que carpeta fuera del document root estaran las imagenes y al momento de querer mostrarlas darle un rename() o copy() de la ruta fuera hacia una carpeta donde tendras momentaneamente las imagenes para referenciarlas en la etiqueta <img> y en algun momento en el que ya no sea necesaria la imagen llamar a unlink()..

pero es algo en lo que estoy divagando todavia.. seria de probarlo.

un saludo.
__________________
http://dev.wsnetcorp.com
  #8 (permalink)  
Antiguo 10/03/2007, 14:03
Avatar de codigoflecha  
Fecha de Ingreso: noviembre-2004
Mensajes: 325
Antigüedad: 19 años, 6 meses
Puntos: 3
Re: Ocultar imágenes y pdf a los usuarios

Cita:
La opcion de poner tus documentos fuera de DOCUMENT ROOT de tu web es muy practica y viable(con que tambien podrias hacerlo incluyendo un .htaccess en tu carpeta que contiene tus archivos, algo que podria llevarte a doble logeo... tedioso.) (yo lo he hecho para prevenir acceso directo a PDF's), ademas (no se de donde sacas los enlaces o los pdfs, una base de datos?) si lo unico (suponiendo que estan en una BBDD) que guardas en tu BBD son los las URL de la ubicacion de la imagen o el nombre de la imagen a la hora de listas estos contenidos (en un for o while imagino) puedes hacer uso de $_SERVER['DOCUMENT_ROOT']./../micarpetaconlosarchivos/nombredelarchivo
para referenciarlos fuera del document root.

tambien otra opcion seria guardas los archivos con nombres serializados (codificados, logicamente referenciandolos en tu bbdd con un id unico.).. despues de ahi.. quien va quere ponerse a averiguar los nombres de los archivos???
Hola Ebe, podias explicarme un poco esto de poner los ficheros fuera del document root y acceder a ellos. Verás yo tengo las rutas de unos archivos y pdfs en la base de datos con un link a una carpeta fuera del root, estoy intentando que el usuario al pagar previamente por un contenido poder coger el archivo x y pasarlo a una carpeta temporal del root para enviarle al usuario un enlace.
como pones los nombres de los archivos codificados y los referencio con un id único?
es que no entiendo muy bien lo que comentas si puedes te lo agradezco muchísimo.
saludos
  #9 (permalink)  
Antiguo 10/03/2007, 23:46
Avatar de ebe
ebe
 
Fecha de Ingreso: marzo-2004
Ubicación: Guatemala
Mensajes: 363
Antigüedad: 20 años, 1 mes
Puntos: 11
Re: Ocultar imágenes y pdf a los usuarios

Bueno.. el tema habla de dos formas de almacener en el DOCUMENT ROOT y luego referenciarlos para su uso en nuestras paginas web, estos son:

1. Colocar archivos PDF. .DOC para despues ser descargados por el usuario (esto es para que el unico metodo de acceso a nuestros archivos sea a traves de nuestra aplicacion al igual que en el punto dos)

2. Guardas archivos (en nuestro caso imagenes) fuera del DOCUMENT ROOT para despues utilizarlos en nuestras paginas web (para referenciarlos con la etiqueta <img>).

Como te podras imaginar, si tus imagenes estan fuera del "ROOT" como le llamas, estas no seran mostradas poniendoles el enlace (por ejemplos, que mi root este en C:/www/ y yo tengo guardas mis imagenes en C:/imagenes/) <img src="C:/imagenes/miimagen.jpg" /> ya que (como te das cuenta) no estas en el directoria de publicacion de tus paginas web, para poder publicarlas hay que mantenerlas fuera del root y traerlas al root cuando necesitemos que se muestren.

El codigo basico que he podido armar es como el siguiente (ya tu si lo modificas a tu modo), la idea seria algo asi:

1. para darle a descargar nuestros archivos al usuario( suponiendo un pdf, ya tu puedes cambiarle el MIME type dependiendo del archivo a descargar):


En este ejemplo una variable get me sirve para saber (y formar) el nombre del archivo que esta fuera del root (tu podrias haber hecho tu solicitud a la base de datos para formar este nombre tambien, si guardas el nombre del archivo en tu BBDD):

Código PHP:
<?php
session_start
();
require_once(
$_SERVER['DOCUMENT_ROOT']."/funciones/check-user.php");
chequea_usuario_valido();
//---------------------------------------------------------------------------
$pdf_i=$_GET['el_pdf'];
$pdf_i=trim($pdf_i);

// si no hay id, redirecionamos a otro archivo
if(empty($pdf_i))
{
header("location:http://midominio.com/descargas/down_2004_.php");
exit();
}


$pun=".pdf"// extension del archivo a usar

$pdf_if=$pdf_i.$pun// el id que vienes por get nos sirve para llamar a nuestro archivo fuera del root - en este caso mi archivo tiene el
//mismo nombre que el ID que viene por GET , yo solo le agrego la extension.

$nombre="edicion_$pdf_if"// creo un nombre para el archivo cuando sea descargado  - con este nombre guardara el archivo el cliente

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Fecha en el pasado

header("Cache-Control: no-store, no-cache, must-revalidate"); // cabecera para evitar que se cachee el contenido

header("Cache-Control: post-check=0, pre-check=0"false);

header("Pragma: no-cache");

// cabecera para decirle al navegor del tipo de contenido a ejectuar
header('Content-type: application/pdf');

//aqui le decimos que al navegador lo forzaremos a descargar el archivo pdf
header("Content-Disposition: attachment; filename=$nombre");

// AQUI ES CUANDO LLAMAMOS A NUESTRO ARCHIVO FUERA DEL ROOT PARA QUE SE MUESTRE
readfile($_SERVER['DOCUMENT_ROOT']."/../pdfs/".$pdf_if);

// .............. aqui podrias redirecionar

?>

ahora si lo que necesitas es trabajar con imagenes (las cuales quiere tener fuera del root) y solo llamaras cuando un usuario autorizado la solicite (y que no se puedan acceder directamente desde la barra de direcciones del navegador:

uploadarchivo.php

Código PHP:
<?php

// cabeceras para que no se cachee tu contenido

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Fecha en el pasado
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0"false);
header("Pragma: no-cache");

if(isset(
$_POST['subir'])){

// CHECK THAT ID IS CORRECT
    
if( trim($_FILES['file']['name']) == ''){
    
header("location:uploadarchivo.php?err=1");
    exit;
    }
    
    if(
$_FILES['archivo']['type'] != 'image/jpeg' && substr($_FILES['file']['name'], strlen($_FILES['file']['name']) - 4) != '.jpg' ){
    
header("location:uploadarchivo.php?nojpg=1");
    exit;
    }
    
    
/* AQUI PODRIAS EXPLORAR EL TAMANO DEL ARCHIVO *- TAMBIEN DEBERIAS PONER MAX_FILE_SIZE EN EL FORM.. PARA VALIDAR DOBLEMENTE.
    // if file size is greater than the allowed of 2000000kb, redirect -
    if($_FILES['file']['size'] > 2000000){
    header("location:uploadarchivo.php?err=1");
    exit;
    }
    */

    // RUTA FUERA DE NUESTRO DOCUMENT ROOT
    
$archivo $_SERVER['DOCUMENT_ROOT'].'/../secureinfo/'.$_FILES['file']['name'];
    
// $archivotmp = $_FILES['file']['tmp_name'];
    // echo($archivo1);
    // exit;
    
    // check if file is copy without problem to itss new location.
    
if(!move_uploaded_file($_FILES['file']['tmp_name'], $archivo)){
         echo(
'Problem moving file to new location, try again in a few minutes.');
         exit;
     }
     
     
     
/*******************************
     * COMO TE DAS CUENTA ARRIBA.. AQUI YA HEMOS GUARDADO EL ARCHIVO FUERA DEL ROOT
     * AHORA DESPUES DE HABERLO MOBIDO, DEBERIAS GUARDAR EL NOMBREE DEL ARVCHIVO EN TU BASE DE DATOS
     * PARA CUANDO NECESITES REFERENCIARLO NUEVAMENTE DENTRO DEL ROOT.
     *
     * -*--------------------------
     *
     * AHORA EN LA PARTE DE ABAJO ESTA UN SIMPLE PROCESO DE COMO LO PODRIAS MOSTRAR NUEVAMENTE CUANDO 
     * LO NECESITES (SUPONIENDO QUE $_FILES['file']['name']  ES EL NOMBRE DE LA IMAGEN PREVIAMENTE ALMACENADO EN TU BBDD
     * AL FINAL LA MUESTRO EN MI PAGINA MOVIENDOLA FUERA DEL ROOT AL ROOT (EN LA CARPETA PROTECTED)
     * AL FINAL BORRANDOLA.. COMO TE DIGO.. LA IDEA IRIA POR AQUI.. YA TU COMO LA CAMBIES A TU NECESIDAD.
     **********************************/
     
     
     
    // echo '';
    // exit;
    
$destino '/protected/';

                
// get the file back from document root level below
                
if(!copy($_SERVER['DOCUMENT_ROOT'].'/../secureinfo/'.$_FILES['file']['name'], $_SERVER['DOCUMENT_ROOT'].'/protected/'.$_FILES['file']['name'])){
echo(
'no se puede copiar el archivo');

}
                
                
                echo(
'<img src="/protected/'.$_FILES['file']['name'].'" />');
                
                
                
// PONGO UN SLEEP SOLO PARA COMPROBAR COMO COPIO LA IMAGEN FUERA DEL ROOT AL ROOT (PROTECTED)
                // DESPUES LA BORRO
                // ESTE PROCESO DE BORRADO LO DEJO PARA QUE TU VEAS EN QUE MOMENTO Y COMO LO IMPLEMENTEAS.
                
                
                
sleep(20);
                
                
                
// AQUI ES CUANDO BORRO LA IMAGEN,, YA QUE NO QUIERO QUE QUEDE DENTRO DEL ROOT
                // CONTENIDO SOLO ACCESIBLE POR APLICACION.
                
                // if(unlink($_SERVER['DOCUMENT_ROOT'].'/protected/'.$_FILES['file']['name']))
                // echo(' archivo borrado normalmente porque ya no lo usaremos Y NO QUEREMOS QUE QUEDE EN EL ROOT.');
                
                // }
                
                




}else{
?>
<html>
<head>
<title>PRUEBA</title>
<body>
<?php
//echo("<img src='$ruta[0]$ruta[1]/secureinfo/butterfly.gif"."' />");
?>
<form action="uploadarchivo.php" method="post" enctype="multipart/form-data" name="form1">
  <p><label for="archivo">Archivo</label>
    <input type="file" name="file" id="file" />
</p>
  <p>
    
    <input type="submit" name="subir" value="subir" id="subir" />
</p>
</form>
</body>
</html>

<?php
}
?>

por aqui iria la idea.. es un codigo rapidamente plasmado paero la idea esta ahi.. como poner pdf a descarga o poner imagenes fuera de tu document root y mostrarlas en tus paginas cuando las necesites (y ya tu decides si borrarla al final y en que momento hacerlo)

un saludo.

http://php.net/header
http://php.net/copy
http://dns.bdat.net/trucos/faqphp-v1/x801.html
__________________
http://dev.wsnetcorp.com

Última edición por ebe; 11/03/2007 a las 04:24 Razón: deleted none $_FILE checking / add image mime type
  #10 (permalink)  
Antiguo 11/03/2007, 05:19
Avatar de codigoflecha  
Fecha de Ingreso: noviembre-2004
Mensajes: 325
Antigüedad: 19 años, 6 meses
Puntos: 3
Re: Ocultar imágenes y pdf a los usuarios

Hola ebe, antes de nada muchísimas gracias por tu completa respuesta, voy a verla detenidamente y te cuento.
Lo que estoy intentando terminar de una tienda virtual, es que el usuario identificado al pagar por un contenido forzar al navegador para que se pueda descargar un archivo (.pdf o .zip), como te comenté he puesto los contenidos en una carpeta fuera del "root", para evitar que se pueda acceder a estos contenidos y luego que la descarga del archivo pues caduque para ese usuario en por ej. 72 horas.
La segunda opción que pones es sólo en el caso de hacer llamadas a imágenes?
saludos y gracias nuevamente
  #11 (permalink)  
Antiguo 11/03/2007, 06:43
Avatar de ebe
ebe
 
Fecha de Ingreso: marzo-2004
Ubicación: Guatemala
Mensajes: 363
Antigüedad: 20 años, 1 mes
Puntos: 11
Re: Ocultar imágenes y pdf a los usuarios

Cita:
La segunda opción que pones es sólo en el caso de hacer llamadas a imágenes?
especificamente es para desplegar contenido inline ( en te caso una imagen, a diferencia del primero que fuerza del download del attachment)

un saludo.
__________________
http://dev.wsnetcorp.com
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:44.