Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > PHP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-01-2006
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
Que significa este codigo?

Código PHP:
    $file="/home/web/archivo.txt";
    
$filename "archivo.txt";

    
Header "Content-Type: application/octet-stream");
    
Header "Content-Length: ".filesize($filename));
    
Header"Content-Disposition: attachment; filename=$");
    
readfile($filename); 
El codigo que les muestro arriba lo encontre en la web buscando como ocultar la url de un archivo al iniciar una descarga.

Lo que me piden es hacer una web que permita realizar algunas descargas unicamente si el usuario ha introducido una clave que se le envia por correo, pero al llegar a este punto me encuentro con que cualquier usuario puede ver de donde pueden descargar el archivo desde el cuadro que aparece en cualquiera de los exploradores al iniciar una descarga.

La verdad no entiendo para nada este codigo, lo que dice la explicacion de ello es:

Cita:
puedes llamar el archivo algo asi como archivo.php?id=1
El nombre lo guardas en la base de datos y lo sacas a partir del id.

El usuario solo vera que baja desde archivo.php?id=1 y el nombre que aparecera en el brower es "archivo.txt"

O sea, no hay forma de saber donde esta el archivo original....
Pero aun asi, no se como funciona.

Saludos y gracias por sus respuestas.
Responder Con Cita
  #2  
Antiguo 08-01-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Para mi que estaría más correcto así:

Código PHP:
$file="/home/web/archivo.txt";
$filename "otro_nombre_de_archivo.txt";

Header "Content-Type: application/octet-stream");
Header "Content-Length: ".filesize($file));
Header"Content-Disposition: attachment; filename=$filename");
readfile($file); 
$file es el archivo real, cuya ubicación puede estar incluso fuera del árbol de directorio web, esto es, fuera de htdocs, de manera que no es directamete alcanzable desde fuera.

$filename es el nombre que deseas que le aparezca al usuario, puede ser cualqiera que se te ocurra.

Los header le indican al navegador del usuario que lo que el servidor manda tiene por nombre $filename y le indica el tamaño de forma que el navegador pueda poner la barra de progreso de descarga.

readfile simplemente lee el archivo (el real) y lo escupe hacia el navegador.

El primer header entonces, indica alnavegador (creo) que es una archivo a descargar y no algo que presentar en la ventana.

El script donde colocarías este código tendría primero que revisar si se ha introducido la clave.

El usuario únicamente verá que se está descargando un archivo de nombre 'otro_nombre_de_archivo.txt' pero no podrá saber que el archivo original en realidad se llama 'archivo.txt' y- más importante -no sabrá su ubicación real.

// Saludos
Responder Con Cita
  #3  
Antiguo 08-01-2006
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
Hoye Roman, mejor explicado, ni con tutor privado.

Muchas gracias.
Saludos desde Guatemala.
Responder Con Cita
  #4  
Antiguo 08-01-2006
Avatar de Zeta
Zeta Zeta is offline
Miembro
 
Registrado: feb 2005
Posts: 215
Poder: 20
Zeta Va por buen camino
Lightbulb

Seguro que se puede ocultar el lugar de la descarga?

con el administrador de descargas de Mozilla se puede ver desde donde se descarga aunque tenga el "archivo.php?id=1" haciendo click derecho y propiedades en el archivo.

Y me parece que con otros también, con el DAP por ejemplo.

Creo que hay que encararlo desde el punto de vista de los permisos y tiempos de acceso al lugar donde se descarga (creo )


Saludos
__________________
And I'd like an hour on the holodeck with Seven of Nine.
Responder Con Cita
  #5  
Antiguo 08-01-2006
Avatar de Xianto
Xianto Xianto is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nací en Neuquén (ARG), desde 2001 Spain
Posts: 151
Poder: 20
Xianto Va por buen camino
En todos los navegadores si le das a un link a un archivo de texto, por defecto te lo mostrará sin presentarte opción a descargarlo, asi que debes tu seleccionarlo y copiarlo o un guardar como.

Enviando los headers al navegador, se puede hacer que el navegador no "interprete" y que haga lo que le dice el host. En este caso una web, asi seria la única forma de poder presentarle al que esta mirando la web un fichero para descargar, que simplente es un TXT.

Pero bue... el readfile esta de más en esas lineas, si lo que estas buscando es hacer un anti-leech (que el usuario final no vea de donde descarga)...

Si esta bien hecho no lo ve ni Dios... ni con mozilla ni nada.

Este me ha sido útil durante mucho tiempo, y aun nadie ha logrado pasarlo.

Código PHP:
<?php
require("../config_sitio.php");
$rs1=mysql_query("SELECT * FROM ".$tlogs." where ip='".GetHostByName($REMOTE_ADDR)."'");
$fil=mysql_num_rows($rs1);
if (
$fil>0)
{
 
$ADMIN[defaulturl] = "[url="http://www.tuweb.com"]http://www.tuweb.com[/url]";
 
$ADMIN[url_1] = "[url="http://www..com/files"]http://www.tuweb.com/files[/url]";
 
$desde $HTTP_REFERER;
 
$pos strpos($desde,"com");
 if (
$pos === false)
 {
  
header("Location: $ADMIN[defaulturl]");
 }else{
  
$doweb=substr($desde0$pos+3); 
 }
 if (
$doweb != "[url="http://www..com"]http://www.tuweb.com[/url]")
 
{
  
header("Location: $ADMIN[defaulturl]");
 }else{
  
$theu "url"."_"."$site";
  require(
"../config_sitio.php");
  
$rs1=mysql_query("SELECT * FROM ".$tdown." where id=".$file);
  
$fil=mysql_num_rows($rs1);
  if (
$fil>0)
  {
   
$rs1 mysql_query("UPDATE ".$tdown." set descargas=descargas+1 where id=".$file);
  }else{
   
$rs1 mysql_query("INSERT INTO ".$tdown." (id, descargas) VALUES(".$file.",1)");
  }
  
$db null;
  
$rs1 null;
  
$fil null;
  
header("Location: $ADMIN[$theu]/$file.zip");
 }
}else{
 
$db null;
 
$rs1 null;
 
$fil null;
 echo 
"<script>";
 echo 
"window.location.href='$desde';";
 echo 
"alert('Necesitas tener un usuario del foro y estar conectado.');";
 echo 
"</script>";
}
?>
Bue, este código lo hice un dia, para alguien que queria que la gente que se descargue sus archivos, fueran miembros de un foro.

Ya me diras si te sirve !

Saludetes.
__________________
El diseño dira si tiene futuro...

Última edición por dec fecha: 08-01-2006 a las 15:00:29.
Responder Con Cita
  #6  
Antiguo 08-01-2006
[kayetano] kayetano is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Elche
Posts: 644
Poder: 21
kayetano Va por buen camino
Hola

Como bien dice Xianto este código lo único que hace es obligar al navegador a abrir la ventana de descarga.

Si lo que quieres es que no puedan localizar tus archivos puedes hacerlo de dos formas muy fáciles:

Primera opción:
1. Identificar al usuario.
2. Cargar en memoria el archivo, con fopen y fread por ejemplo.
3. Mandar las cabeceras ya citadas.
4. Enviar el contenido del archivo que tenemos cargado en memoria
Código PHP:
echo $datos
De esta forma es imposible que sepan donde esta el archivo, el problema es que si son archivos muy grandes vas a saturar la memoria del servidor.

Segunda opción:
1. Identificar al usuario.
2. Copiar el archivo que se va a descargar en una carpeta temporal. Te aconsejo que utilices la funcion tmpfile() para generar un archivo con nombre único para no sobre escribir el que este descargando otro usuario.
3. Mandas las cabeceras.
4. Envias el archivo desde el directorio temporal.
5. Borras el archivo del directorio temporal, con lo que ya no es accesible para nadie.
__________________
Salu2
KAYETANO

Cómo hacer preguntas de manera inteligente
Responder Con Cita
  #7  
Antiguo 08-01-2006
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
Muchas gracias Xianto por tu ayuda, tendre que revisarlo con un poco de tiempo, porque no son muy bueno en esto, cualquier duda que tenga con respecto a tu codigo te la pongo luego.

Saludos y mil gracias.
Responder Con Cita
  #8  
Antiguo 08-01-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos

Es tema me ha interesado y tengo una preg.:

Y si el usuario final está detras de un Proxy?

Citaré el "WinProxy", con éste me he dado cuenta qeu te da detalles de todo lo que descargas y de las rutas.
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #9  
Antiguo 08-01-2006
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
Gracias a ti tambien Kayetano por tu ayuda.

Ahora vengo con lo siguiente:

En el host donde se pondra esta pagina, hay un directorio a donde solo se puede accesar mediante FTP, que es el directorio superior a la web.
Dentro del servidor esta la carpeta "USUARIO" donde habra una carpeta por cada dominio o subdominio que adquiera, lo que se veria de esta forma:

>>usuario
>>>//dominio1.com
>>>>>//carpeta_dentro_del_dominio1
//Lo que se veria en el navegador de la siguiente manera:
http://www.dominio1.com/carpeta_dentro_del_dominio1/
>>>//dominio2.com
>>>>>//Carpeta_dentro_del_dominio2
//Lo que se veria en el navegador de la siguiente manera:
http://www.dominio2.com/carpeta_dentro_del_dominio2/

con lo que creo podria hacer lo siguiente:
Código PHP:
$file="../descargas/archivo.txt"
$filename "otro_nombre_de_archivo.txt"
Header "Content-Type: application/octet-stream"); 
Header "Content-Length: ".filesize($file)); 
Header"Content-Disposition: attachment; filename=$filename"); 
readfile($file); 
Con lo que deberia crear una carpeta dentro del directorio principal del ftp que no se veria en el navegador (solo utilizo lo que creo es mi logica, agradeceria comentarios y sugerencias), meter ahi los archivos y poder hacerlo de la forma en la que me lo explica Roman. No quiero decir que con esto descarto las otras opciones, al contrario, tambien las probare y vere de que manera me resulta mejor.

Segun tengo entendido, en esta web si van a haber unos archivos algo grandes, por lo que no se si consumiria mucho tiempo el crear un archivo temporal como me lo dice Kayetano, pero como digo, agradeceria comentarios y sugerencias.

Saludos ya mil gracias a todos.
Responder Con Cita
  #10  
Antiguo 08-01-2006
Avatar de Xianto
Xianto Xianto is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nací en Neuquén (ARG), desde 2001 Spain
Posts: 151
Poder: 20
Xianto Va por buen camino
Cita:
Empezado por vtdeleon
Y si el usuario final está detras de un Proxy?
Repito, si el anti-leech esta bien hecho no se ve nada.

Actualmente lo que uso, pero que es complejo es el archivo .htaccess de apache.

Basicamente los ficheros estan en un directorio, digamos /var/public_html/files/ y tengo un archivo de configuración del sitio que esta en / por lo que no se puede leer, ya que el sitio empieza en /var/public_html/

Con esta idea el fichero de configuración solo es accesible por PHP, asi que ahi pongo un usuario y su password, supognamos el usuario DESCARGA, el cual es el único que tiene acceso a /var/public_html/files/ asi que cuando alguien quiere descargar el anti-leech entra al directorio de descarga con el usuario y la pass correspondiente y envia el fichero al cliente, pero este no solo no puede ver de donde lo descarga, sino que no tiene forma de entrar, y como la pass en el fichero de configuracion esta cifrada, ni yo la se.

Esta es la forma más limpia de hacer esto, sin caer en fallos como llenar el buffer de descarga o que la descarga se pueda ver mediante un proxy.

Saludos.
__________________
El diseño dira si tiene futuro...
Responder Con Cita
  #11  
Antiguo 08-01-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por kayetano
Como bien dice Xianto este código lo único que hace es obligar al navegador a abrir la ventana de descarga.
Lamento diferir pero en el código original, si el archivo se sitúa fuera del árbol de directorios web no hay manera que desde el navegador se vea la ruta.

ReadFile lee el archivo real y lo manda al navegador pero éste no sabe de dóde viene. Lo único que sabe es el nombre que se le asigna en el header y el tamaño.

// Saludos
Responder Con Cita
  #12  
Antiguo 08-01-2006
Avatar de Xianto
Xianto Xianto is offline
Miembro
 
Registrado: oct 2004
Ubicación: Nací en Neuquén (ARG), desde 2001 Spain
Posts: 151
Poder: 20
Xianto Va por buen camino
Nunca he dado permisos a PHP fuera del /var/html/ me parece un fallo de seguridad, en el que mucha gente esta de acuerdo.

Pero si lo haces o si el host que tienes te lo permite, pues seria correcto roman !
__________________
El diseño dira si tiene futuro...
Responder Con Cita
  #13  
Antiguo 08-01-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿En qué consistiría el fallo? Una cosa son los permisos que php tenga y otra los que apache tenga. El hecho de que php pueda acceder a un directorio fuera de htdocs no implica que apache pueda hacerlo. Claro que si el archivo que inicia las descargas no se protege haciendo las verificaciones adecuadas pues entonces sí es inseguro y da lo mismo donde pongamos los archivos.

EDITO:

Sé que puedo equivocarme y estoy abierto a sus argumentos.

// Saludos

Última edición por roman fecha: 08-01-2006 a las 21:25:33.
Responder Con Cita
  #14  
Antiguo 20-01-2006
Avatar de RyCk
RyCk RyCk is offline
Miembro
 
Registrado: ene 2006
Ubicación: Varacruz
Posts: 16
Poder: 0
RyCk Va por buen camino
De hecho tienes razon roman ya que apache es solo un modulo de PHP yo utilizo acceso a otros directorios fuera de /var/www/ por ejemplo /home/usuario/ por mi propia comodidad, la unica diferencia es que esa carpeta la tengo abierta a un VHOST que me lo direcciona a http://dominio/usuario/ apache no puede ír más alla de donde tengo indicado el link virtual asi tenga permisos en home solo me redirecciona la hasta /home/usuario
__________________
RyCk
Responder Con Cita
  #15  
Antiguo 23-01-2006
[kayetano] kayetano is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Elche
Posts: 644
Poder: 21
kayetano Va por buen camino
Hola

Cita:
Empezado por RyCk
De hecho tienes razon roman ya que apache es solo un modulo de PHP ...
Que yo sepa esto es más bien al contrario, PHP puede ser un modulo de Apache, pero que Apache sea un modulo de PHP es la primera noticia que tengo.
__________________
Salu2
KAYETANO

Cómo hacer preguntas de manera inteligente
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 21:49:20.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi