2011-10-09 20 views
7

Por seguridad, voy a mover una colección de archivos y carpetas fuera de la raíz web en un servidor apache, y luego los mostraré dinámicamente. Esto parece mejor que 2 alternativas:¿Cómo se sirven documentos desde fuera de la raíz web usando PHP?

  1. dejarlos web accesible y simplemente crear una página de inicio de sesión php que consigue antepone a cada archivo. El problema es que no son todos archivos php, y no puedo anteponer un archivo de inicio de sesión php a un pdf, imagen, etc.
  2. Déjalos accesibles a través de la web y use la autenticación HTTP para restringir el acceso a todo el directorio. Pero eso introduce problemas que incluyen contraseñas sin formato, ningún método de cierre de sesión elegante, etc.

Así que volvemos a tenerlos fuera de la raíz web pero les brindamos un servicio dinámico. El problema que tengo es que, dado que son todos tipos de archivos diferentes (scripts php, txt, pdf, jpg), no estoy seguro de si debo usar include() o readfile(). Y me encuentro con problemas al enviar los encabezados adecuados para cada archivo para que el navegador los muestre correctamente.

¿Me está faltando otra solución mágica? ¿Hay algún marco que me haya eludido que maneje el servicio de archivos dinámicos y encabezados?

(FYI estoy corriendo Linux, Apache & PHP en un servidor compartido)

+1

Guau, estás tomando un problema fácil y lo estás convirtiendo en uno difícil. –

+2

@Dietrich ¿cuál sería una solución fácil entonces? –

+0

@Pekka: Autenticación HTTP Digest, indique a los usuarios que cierren sus navegadores para cerrar la sesión. –

Respuesta

8

creo que algo como esto funcionaría:

<?php 
$path = realpath(dirname(__FILE__) . '/../my_files/' . $_GET['file']); 

$parts = explode('/', pathinfo($path, PATHINFO_DIRNAME)); 
if (end($parts) !== 'my_files') { 
    // LFI attempt 
    exit(); 
} 

if (!is_file($path)) { 
    // file does not exist 
    exit(); 
} 

header('Content-Type: ' . mime_content_type($path)); 
header('Content-Length: ' . filesize($path)); 

readfile($path); 
+1

Reemplazaría 'mime_content_type()' con las funciones de fileinfo, pero de lo contrario sí. –

0

La forma más simple que puedo pensar es mediante el uso. archivos htaccess. Suponiendo que su servidor web es Apache, por supuesto.

Puede denegar el acceso a cualquier tipo de archivos y/o directorios para todos y permitir solo el host local. De esta forma, no se mostrarán al público, incluso si conocen la ruta/url correcta, pero el servidor y PHP podrán servirlos.

Para diferentes servidores web, debe haber soluciones equivalentes. Además, siempre puedes cambiar a Apache :-)

+0

Bueno, ocultar los archivos del público no fue el problema. Moverlos fuera de la raíz web o restringir el acceso usando .htaccess son equivalentes a mí. Mi problema es un buen método para servir selectivamente esos archivos cuando sea necesario, a usuarios autorizados. – Andrew

+0

... y probablemente sin usar autenticación http simple. De lo contrario, .htaccess todavía sería una opción. – GolezTrol

+0

Los dos problemas son independientes ...Pero ya que tomó un párrafo para explicar su elección de moverlos de la raíz web, pensé que señalaría que este no es un paso necesario. Es decir, cuando dices "... por seguridad, me estoy moviendo ...", no es una razón o medida precisa. –

Cuestiones relacionadas