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 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
  #2  
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
  #3  
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
  #4  
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
  #5  
Antiguo 08-01-2006
[kayetano] kayetano is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Elche
Posts: 644
Poder: 22
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
  #6  
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
  #7  
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
  #8  
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
  #9  
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
  #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 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
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 18:06:04.


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