Restringir el acceso a archivos dentro de una carpeta específica

12 ene 2011, 05:57:54
Vistas: 16.5K
Votos: 2

Posible duplicado:
¿Cómo proteger archivos subidos si el usuario no ha iniciado sesión?

¿Existe alguna forma de restringir el acceso directo a archivos dentro de una carpeta específica solo a usuarios de WordPress que tengan una capacidad específica asignada?

2
Comentarios

¿Limitar el acceso a archivos PHP específicos en un directorio? ¿O a TODOS los archivos en un directorio?

MathSmath MathSmath
12 ene 2011 06:26:54

Limitar el acceso a todos los archivos dentro de un directorio específico para que no sean accesibles directamente por todos, EXCEPTO aquellos usuarios que tengan esa capacidad específica.

NetConstructor.com NetConstructor.com
14 ene 2011 09:24:48
Todas las respuestas a la pregunta 1
1

La solución más fácil en PHP sería crear un script de descarga. Verifica si el usuario tiene los permisos correctos y sirve el archivo al cliente web. O mi preferencia, configurar una carpeta fuera del directorio raíz web y colocar los archivos allí.

Establece los permisos del archivo sin acceso anónimo y permite que el servidor web los lea y los muestre en un archivo PHP como este. El siguiente código lee el archivo y lo envía al navegador.

header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private",false); 
header('Content-disposition: attachment; filename='. $file;
header("Content-Transfer-Encoding:  binary"); 
header("Content-Length: ". filesize(ABSPATH.$dir.$file); 
readfile($dir.$file);
exit();

edición 14-1:

Crea un cuadro de carga normal y cuando el archivo se cargue, muévelo a una carpeta fuera del directorio raíz web (esta carpeta no puede ser accedida por usuarios a través de HTTP, solo por el servidor web).

if (move_uploaded_file( $_FILES['Filedata']['tmp_name'] , $upload_dir.$filename ) ) {
// código para ejecutar después de que el archivo se haya copiado correctamente. Actualiza tu base de datos o algo similar.
}

$upload_dir.$filename es la ruta completa al directorio fuera de la carpeta www. El archivo ahora solo puede ser accedido por el servidor web. Almacena la ubicación en una base de datos con información del cargador. O crea subdirectorios para cada usuario. Necesitas algo para diferenciar los archivos de cada usuario.

Ahora, cuando quieras descargar un archivo, crea un script llamado download.php En ese script verificas si el usuario tiene derechos sobre el archivo.

global $user;
if ($user->id == $uploaded_user_id) {
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private",false); 
    header('Content-disposition: attachment; filename='. $file;
    header("Content-Transfer-Encoding:  binary"); 
    header("Content-Length: ". filesize(ABSPATH.$upload_dir.$file); 
    readfile($upload_dir.$file);
    exit();

}

ahora quieres pasar un file_id o nombre al script de descarga. así que construye el enlace como url/download.php?file=$file. Tienes que llamar esto directamente o en las primeras etapas de tu plugin o obtendrás el mensaje de "headers already sent". El script verificará si el usuario tiene derechos y comenzará a enviar datos binarios.

Debería ser algo como esto, espero que ayude. No es completo pero debería darte un comienzo.

12 ene 2011 10:45:31
Comentarios

muchas gracias por tu respuesta. Te agradecería mucho si pudieras ampliar tu respuesta. Verás, lo que me gustaría hacer es crear un metabox personalizado para subir archivos a una carpeta específica en el servidor. Luego me gustaría restringir el acceso directo a esos archivos por parte del público a todos los visitantes del sitio web, excepto para aquellos usuarios que hayan iniciado sesión y tengan la capacidad específica de ver todos estos archivos. ¿Cuál crees que sería la mejor manera de lograr esto?

NetConstructor.com NetConstructor.com
14 ene 2011 09:26:39