2009-04-10 51 views
6

He heredado una aplicación con un agujero de seguridad evidente.Restringir el acceso a archivos a usuarios autorizados de php

Tiene seguridad basada en sesiones, pero las cargas de archivos (que son específicas del usuario) no están aseguradas de ninguna manera y se almacenan en el árbol de archivos público.

Los nombres de archivo no siguen ninguna convención como tal, por lo que es difícil de adivinar, pero los datos son confidenciales y, por lo tanto, debo implementar una medida de seguridad para evitar el acceso no autorizado a los archivos.

Mover la ubicación de los archivos no es realmente una opción, por lo que estoy buscando una solución de htaccess para reenviar las solicitudes a un script de gestor de php.

¿Alguien tiene experiencia en la implementación de este tipo de cosas o cualquier buena solución alternativa? Ejemplos específicos de la sintaxis de .htaccess son muy apreciados, ya que estoy luchando en esta área.

Respuesta

6

No entiendo por qué moverlos no es una opción, ya que enviar solicitudes a un controlador significa que ya no importa dónde están almacenados. Pero tú eres el hombre en la escena.

.htaccess se parece a:

RewriteEngine on 
RewriteRule path/to/where/these/files/live/(.*) /handlerscript.php/$1 

A continuación, recoger la ruta del archivo y el nombre del restante $_SERVER['PATH_INFO'].

+0

Olvidé mi mod_rewrite ... esta es una mejor solución. – Matt

+0

Gracias, voy a echarle un vistazo a esta solución: la razón por la que no quiero mover la ubicación de los archivos es que los usuarios reciben correos electrónicos con enlaces a sus archivos (una vez más, no me apresuro a agregarlos). Supongo que aún podría hacerse, pero ¿requeriría un poco más de trabajo para manejar la redirección? – BrynJ

+0

Debería haber agregado a lo anterior que le devolveré al usuario a un mensaje de inicio de sesión en el futuro (a través del controlador) si no han iniciado sesión. – BrynJ

0

Creo que puede necesitar escribir un script que sirva las imágenes, luego use htaccess para restringir completamente el acceso a las imágenes reales desde un navegador.

El script puede tomar la ruta web a la imagen, decidir si el usuario tiene acceso, luego usar algo como fpassthru para enviar una imagen real al navegador.

Sin embargo, todas las referencias a las imágenes deberían modificarse para hacer referencia al script de publicación.

Así que en lugar de acceder a las imágenes con /images/123/5423453245.jpg, sería /image.php?images/123/5423453245.jpg

O algo similar a eso.

+0

Veo lo que dice, pero eso es lo que realmente debo evitar (cambiar los enlaces). Por cierto, no son imágenes :-) – BrynJ

3

Bueno, se podría realizar análisis sintáctico Apache .jpg archivo de una carpeta determinada añadiendo lo siguiente a su .htaccess

AddHandler php5-cgi .jpg 

entonces se podría definir un archivo de php para analizar la solicitud de la forma en que el caos fue recomendar y haciendo una cierta validación, a continuación, sólo volver cabeceras jpeg junto con la imagen correcta u'd gustaría mostrar

He aquí un ejemplo

<?php 
if($validUser) 
    { 
    header("Cache-control: No-cache"); 
    header("Pragma: No-cache"); 
    header("Content-Type: image/jpeg"); 
    //correct picture address 
    $img = imagecreatefromjpeg("2326_b_lil.jpg"); 
    imagejpeg($img); 
    } 
    else 
    { 
    //code for error image 
    } 
?> 

pl easy, hágamelo saber si quiere un ejemplo más extenso

+0

Los archivos generalmente no son imágenes, pero podrían serlo. Sin embargo, su ejemplo me hizo pensar: ¿no sería mejor usar readfile en lugar de volver a crear la imagen (su código se convierte en un archivo de color verdadero sin comprimir y luego en un archivo jpeg)? – BrynJ

+0

Solo estoy usando esa función para cargar fácilmente los datos del archivo y enviarlos al navegador, puede reemplazar este procedimiento con un simple fopen y haciendo eco de la entrada, ya que usted envió encabezados jpeg, el navegador lo interpondrá como una imagen – perrohunter

Cuestiones relacionadas