2009-05-15 9 views
7

Estoy publicando documentos que requieren que el usuario se registre antes de la descarga. Actualmente, una vez que registrarse y acceder, los enlaces a los documentos se muestran como:¿Cómo sirvo un archivo descargable en línea sin exponer la ruta física?

myurl.com/docs/mypdf.pdf 

Así que la ruta física del documento se expone a cualquiera conectado ¿Cuál es la mejor práctica para mantener la ruta física al. documento oculto para que los usuarios registrados no puedan compartir enlaces directos con usuarios no registrados o publicar enlaces directos a los documentos en otra parte?

EDIT: Estaba buscando una idea que fuera independiente del idioma, así que elegí algunos de mis idiomas favoritos para las etiquetas. La implementación real en este caso es ASP clásica. Actualmente estoy usando un script de envoltura de descarga que confirma que el usuario ha iniciado sesión antes de redirigir a la URL del documento real. Simplemente no lo incluí en mi pregunta por simplicidad.

Respuesta

11

No hagas eso. En su lugar, mantenga los archivos en algún lugar fuera del árbol de documentos y luego haga que sean accesibles usando una secuencia de comandos (por ejemplo, php, .Net, lo que sea)

La secuencia de comandos puede verificar si están conectados, validar si se les permite el archivo y si es así devuélvelo. La ruta a la que van podría parecerse más a esto ... /download.php?file=mypdf.pdf

Algo parecido a ...

<?php 
if (IsUserLoggedIn()) 
    readfile('/secret/path/to/file/mypdf.pdf'); 
?> 
8

La mejor manera es leer el archivo desde una ruta no accesible en la web y escribirlo en la secuencia de salida.

Esto parecía mostrar un ejemplo OK en php que parecía estar usando? Simplemente agregue un control de seguridad a la parte superior de php y echelos si no están autorizados.

http://www.higherpass.com/php/Tutorials/File-Download-Security/

+3

Podría ser una buena idea usar el servidor web para traducir de forma transparente http://myurl.com/docs/mypdf.pdf a http://myurl.com/docshandler.php?file=mypdf.pdf, y a docshandler maneja la autenticación antes de enviar el archivo o muestra un mensaje de error. –

1

la mejor manera de hacerlo es utilizar un archivo de secuencias de comandos php/asp o serverside que lee el documento de un lugar que tampoco está disponible al exterior

que archivo se puede comprobar si el usuario ha iniciado la sesión y también puede ocultar la ruta de acceso al archivo físico

por lo que la URL se www.yourwebsite.com/file.php?file=image.png~~V~~singular~~3rd

archivo.php sería verificar que el usuario ha iniciado sesión en luego leería el archivo o lo redirigirá a la página de inicio de sesión

0

No está claro si está utilizando ASP.NET, ASP.NET MVC u otra cosa. Sin embargo, este post ...

How can I present a file for download from an MVC controller?

... muestra cómo devolver mediante programación un archivo al usuario utilizando ASP.NET (la cuestión muestra el camino ASP.NET, las respuestas muestran el camino MVC) .

Esto permitiría a los archivos físicos para estar en una carpeta de otro modo no accesible para el usuario, y que permitirá añadir la validación antes de devolver el documento a garantizar que el usuario se registró etc.

Si' En una etapa de su desarrollo donde no es demasiado tarde para usar ASP.NET MVC, hágalo. Este escenario (que sirve un archivo) se convierte en un trazador de líneas, y muchas otras cosas serán más fáciles (en particular, la prueba de su aplicación).

0

Se puede usar un IHttpHandler en .NET, aunque es necesario tener acceso comodín en IIS. Puede usar un controlador basado en sesión.

1

Lo que se quiere hacer es crear una página PHP que hace dos cosas:

  1. autenticar al usuario que realiza la solicitud
  2. flujo del archivo al cliente

Este link ayudará con las transmisiones Y este código puede ser útil:

header("Content-Disposition: attachment; filename=$name of pdf that you want to download"); 
header("Content-Type: application/pdf"); 
header("Content-Length: ".filesize("$location of pdf/$name of pdf that you want to download")); 
header("Pragma: no-cache"); 
header("Expires: 0"); 
$fp=fopen("$location of pdf/$name of pdf that you want to download","r"); 
print fread($fp,filesize("$location of pdf/$name of pdf that you want to download")); 
fclose($fp); 
exit(); 

vio esto en una discusión here.

+0

hay un error tipográfico en la primera línea del encabezado: Content-Disposition: attachment; – Eineki

+0

fijo - gracias por el aviso. –

0
  1. utilizar un script para control de acceso

    Hacer un guión como myurl.com/file.php?docs/mypdf.pdf que comprueba que el usuario tiene derechos de acceso al archivo. El script recuperará el archivo de un lugar que no está visible en la web.

  2. (Opcional) Use mod_rewrite para hacer que sus direcciones URL se vean bien, y redirija al usuario a la secuencia de comandos file.php. Algo así como:

    docs RewriteCond /% {} REQUEST_FILENAME -f

    RewriteRule^$ archivo.php/$ 1 [QSA, L]

    Esto redirigirá/docs/mypdf (*.). pdf a /file.php?docs/mypdf.pdf pero se ve mejor para el usuario.

1

Tuve un problema similar hace muchas lunas en ASP clásico.

Guardado de archivos en un directorio fuera de la raíz web.

Tras la verificación, envié el archivo a través de ADODB.Stream, y luego verifiqué la extensión del archivo para asegurarme de que tenía el conjunto de tipo mime adecuado.

Cuestiones relacionadas