2009-11-22 22 views
11

Estoy escribiendo un script de descarga anti-leeching, y mi plan es crear un archivo temporal, que se llame por ID de sesión, luego de que la sesión expire, el archivo se eliminará automáticamente. Es posible ? ¿Y puedes darme algunos consejos sobre cómo hacerlo en PHP?Crear archivo temporal y eliminar automáticamente

Muchas gracias por cualquier respuesta

+0

¿Cuánto tiempo se debe guardar el archivo? – Ikke

+0

¿Podrías por favor ser más específico sobre lo que estás tratando de lograr? Anti-Leeching DL Script es un poco vago. ¿Cuál es la UseCase o problema que el script está tratando de resolver? – Gordon

+0

Hola lkke, Solo quiero permitir que el usuario descargue en su sesión solo, como que no puede simplemente copiar y pegar el enlace a otra persona Hola Gordon, Quiero forzar a los usuarios a descargar archivos de mi sitio, controla la velocidad. Entonces, creo que para crear un archivo temporal en un directorio temporal en documentos HTTP para que el usuario pueda descargarlos y luego eliminarlos (automáticamente) después de que la sesión caduque – mrblue

Respuesta

9

Tenemos uno o más archivos disponibles para descargar. Crear un archivo temporal para cada solicitud de descarga no es una buena idea. Crear una symlink() para cada archivo es una idea mucho mejor. Esto ahorrará un montón de espacio en disco y reducirá la carga del servidor.

Nombrar el enlace simbólico después de la sesión del usuario es una buena idea. Una mejor idea es generar un nombre de enlace simbólico aleatorio & asociado a la sesión, de modo que el script pueda manejar múltiples descargas por sesión. Puede usar session_set_save_handler() (link) y registrar una función personalizada read que comprueba si hay sesiones expiradas y elimina los enlaces simbólicos cuando la sesión ha expirado.

+1

Hola pygorex1, Esto es exactamente lo que estoy buscando. Muchas gracias. – mrblue

+0

El único problema es que el enlace simbólico no funciona en php ver 5.2 – coderama

+0

El enlace es ahora 404, simplemente te colocó un "pinback" para que puedas arreglarlo –

8

PHP tiene una función para que el nombre tmpfile. Crea un archivo temporal y devuelve un recurso. El recurso se puede usar como cualquier otro recurso.

E.g. el ejemplo del manual:

<?php 
$temp = tmpfile(); 
fwrite($temp, "writing to tempfile"); 
fseek($temp, 0); 
echo fread($temp, 1024); 
fclose($temp); // this removes the file 
?> 

El archivo se elimina automáticamente cuando se cierra (usando fclose()), o cuando termina la secuencia de comandos. Puede usar cualquier función de archivo en el recurso. Puede encontrar estos here. ¿Espero que esto te ayudará?

Otra solución sería crear el archivo de la manera habitual y utilizar un cronjob para comprobar periódicamente si una sesión ha expirado. La fecha de vencimiento y otros datos de la sesión podrían almacenarse en una base de datos. Use la secuencia de comandos para consultar esos datos y determinar si una sesión ha expirado. Si es así, quítelo físicamente del disco. Asegúrese de ejecutar el script una vez cada hora aproximadamente (según su tiempo de espera).

+0

No creo que sea una solución para la pregunta de mrblue porque el archivo se elimina en script end/fclose() y no cuando la sesión expira. –

+0

Tienes razón, supongo. Debe haber estado leyendo sobre esa parte. Agregué más información a mi publicación. Ahora depende de él;) – TheGrandWazoo

+0

Hola TheGrandWazoo, gracias por tu respuesta. He pensado en esa solución, pero no podría ser posible debido al problema de rendimiento si el sitio se amplía y Philippe tiene razón, mi preocupación es que PHP admita la función "hook", como se llama automáticamente después de que la sesión expira o empieza. – mrblue

2

Le sugiero que no copie el archivo en primer lugar. Haría lo siguiente: cuando el usuario solicite el archivo, genere una cadena única aleatoria para darle el enlace de esta manera: dl.php?k=hd8DcjCjdCkk123 luego coloque esta cadena en una base de datos, almacenando su dirección IP, tal vez la sesión y el tiempo que ha generado el enlace. Luego otro usuario solicita ese archivo, se asegura de que todas las cosas (hash, ip, etc.) coincidan y el enlace no haya expirado (por ejemplo, no más de las N horas transcurridas desde la generación) y si todo está bien, use PHP para canalizar el archivo. Establezca un trabajo cron para examinar el DB y eliminar las entradas caducadas. ¿Qué piensas?

tmpfile

crea un archivo temporal con un nombre único en de lectura-escritura (w +) y el modo de devuelve un identificador de archivo. El archivo es eliminado automáticamente cuando se cierra (usando fclose()), o cuando termina el script .

+0

No creo que sea una solución para la pregunta de mrblue porque el archivo se elimina en script end/fclose() y no cuando la sesión expira. –

+0

Hola Røddik, Philippe tenía razón, pensé en esa solución, pero no es aplicable en mi circunstancia especial el problema de rendimiento – mrblue

3

¿Podría explicar su problema un poco más profundamente? Porque no veo una razón para no usar $_SESSION. Los datos en $_SESSION se almacenan en el lado del servidor en un archivo (vea http://php.net/session.save-path) Por cierto. Al menos de manera predeterminada. ;-)

+0

Hola Philippe, Sí, realmente quieren usuario $ _SESSION (en realidad lo hice), pero No puedo encontrar ningún documento o tema para mencionar sobre algo, como acción de "enlace", por ejemplo: podemos hacer una función que el sistema llama automáticamente después de que una sesión caduque o comience. Esa es mi idea y preocupación. Gracias por su tiempo – mrblue

+0

haga lo contrario. reaccionan cuando se crea una nueva sesión (por ejemplo, $ _SESSION está vacía y la has llenado previamente), no cuando una sesión expira. el problema es que una sesión puede caducar sin que el usuario tome ninguna medida (la sesión no está actualizada y el recolector de basura la elimina). ¿Qué estás tratando de hacer exactamente? –

2

Ok, por lo que tenemos los siguientes requisitos en lo que va

  1. Deje que el usuario descarga en su/su sesión sólo
  2. ninguna copia & pegar el enlace a otra persona
  3. Los usuarios tienen para descargar desde el sitio, por ejemplo sin control de velocidad
  4. hotlinking

Vamos a ver.Esto se no código funciona, pero debería funcionar a lo largo de estas líneas:

<?php // download.php 

session_start(); // start or resume a session 

// always sanitize user input 
$fileId = filter_input(INPUT_GET, 'fileId', FILTER_SANITIZE_NUMBER_INT); 
$token = filter_input(INPUT_GET, 'token', FILTER_UNSAFE_RAW); 
$referer = filter_input(INPUT_SERVER, 'HTTP_REFERER', FILTER_SANITIZE_URL); 
$script = filter_input(INPUT_SERVER, 'SCRIPT_NAME', FILTER_SANITIZE_URL); 

// mush session_id and fileId into an access token 
$secret  = 'i can haz salt?'; 
$expectedToken = md5($secret . session_id() . $fileId); 

// check if request came from download.php and has the valid access token 
if(($expectedToken === $token) && ($referer === $script)) { 
    $file = realpath('path/to/files/' . $fileId . '.zip'); 
    if(is_readable($file)) { 
     session_destroy(); // optional 
     header(/* stuff */); 
     fpassthru($file); 
     exit; 
    } 
} 
// if no file was sent, send the page with the download link. 
?> 
<html ... 

<?php printf('a href="/download.php?fileId=%s&amp;token=%s', 
       $fileId, $expectedToken); ?> 

... 
</html> 

Y eso es todo. No se requiere base de datos. Esto debería cubrir los requisitos 1-3. No puede controlar la velocidad con PHP, pero si no destruye la sesión después de enviar un archivo, puede escribir un contador en la sesión y limitar el número de archivos que se le enviará al usuario durante una sesión.

Estoy completamente de acuerdo en que esto podría resolverse de forma mucho más elegante que con este hack de monkeyform, pero como prueba de concepto, debería ser suficiente.

+0

Hola Gordon, Eso es casi el 90% de lo que estaba escribiendo en mi código, pero el suyo tiene una mejor comprobación de seguridad con token. Muy apreciado por eso. – mrblue

+0

El token agrega seguridad, pero también hace que no tenga que volver a enlazar o copiar sus archivos, porque el token es único para session + file. El token es básicamente lo que pygorex1 crearía para un nombre de enlace simbólico. Solo en lugar de crear un enlace simbólico del mismo que luego tendría que eliminar de alguna manera, simplemente envíe el nombre/token con el ID de archivo regular. Menos mantenimiento. – Gordon

0

Tal vez sea demasiado tarde para responder pero intento compartir en la característica de Google!

si utiliza CPanel hay una forma corta y rápida para el bloqueo de solicitud externa en sus archivos alojados cuyo nombre es: de HotLink.

puede Habilitar HotLinks en usted Cpanel y asegúrese de que nadie puede ha solicitado su archivo de otro alojamiento o utilizar sus archivos como referencia de descarga.

0

Para lograr esto, crearía un archivo y lo protegería utilizando chmod, lo que dejaría de estar disponible para el público. O bien, como alternativa, guarde los contenidos en una fila de la tabla de la base de datos, búsquelos siempre que sea necesario.

Haciéndolo para descargar como un archivo. Para hacerlo, obtendría el contenido del archivo protegido o, si está almacenado en una tabla de base de datos, lo buscaré y simplemente lo mostraré. Utilizando los encabezados php, yo le daría el nombre deseado, la extensión, especificaría su tipo y finalmente forzaría al navegador a descargar el resultado como un archivo sólido.

De esta manera, solo necesita guardar datos en un lugar, ya sea en un archivo protegido o en una base de datos. Obligue al navegador del cliente a descargarlo tantas veces como se cumplan las condiciones, por ejemplo, siempre que el usuario inicie sesión, y así sucesivamente. Sin tener que preocuparse por el espacio en el disco, crear cualquier archivo temporal, cronJobs y/o eliminación automática del archivo.

Cuestiones relacionadas