Solo permita el acceso a archivos en el directorio desde el sitio web del que forman parte

Mar 05 2020

Sé que hay muchas preguntas similares y las he rastreado todas, pero parece que no puedo hacer que ninguna de las soluciones funcione.

Tengo una carpeta en la raíz de mi sitio web que contiene archivos cargados que se pueden ver y descargar del sitio cuando un usuario inicia sesión. Están aquí: https://example.com/uploads(por ejemplo). Necesito que el sitio continúe para poder acceder a ellos para mostrarlos (algunos son imágenes) y proporcionar enlaces para descargar (archivos PDF, etc.) para que el usuario pueda descargarlos, pero quiero evitar a cualquiera que obtenga la URL de un archivo en particular pudiendo descargarlos directamente, así:https://example.com/uploads/2020/02/myfile.pdf. O estas URL ingresan a los motores de búsqueda (o si lo hacen, el servidor evita que se acceda a ellas directamente.

Intenté agregar un archivo .htaccess en el directorio de cargas con el siguiente contenido:

Order Deny,Allow
Deny from all
Allow from 127.0.0.1

Y lo he intentado

Order Allow,Deny
Deny from all
Allow from 127.0.0.1

... como leí, eso podría permitir llamadas HTTPS desde el sitio mismo, así como URL locales.

Pero prohíbe el sitio y una solicitud de URL directa, lo cual no es bueno.

¿Hay alguna forma de hacer esto?

Respuestas

1 MrWhite Mar 06 2020 at 01:25

La interfaz de usuario que proporciona el acceso 'oficial' a los archivos tiene autenticación de usuario, sí, pero los archivos aún existen en un directorio que no impedirá que nadie los acceda si conocen la URL.

Debe proteger los archivos utilizando el mismo sistema de autenticación que está utilizando para proteger el acceso a la interfaz de usuario. La única forma en que podría proteger estos recursos mediante la dirección IP (la dirección IP del cliente ), como está intentando actualmente .htaccess, es si la IP del cliente es fija y se conoce de antemano (pero si este fuera el caso, entonces no necesitaría otra forma de autenticación para empezar).

Por lo tanto, esto será principalmente un ejercicio en cualquier lenguaje de script / CMS que se esté utilizando para autenticar la "interfaz de usuario".

Lo que puede utilizar .htaccesses para reescribir las solicitudes de estos archivos en su script del lado del servidor que maneja la autenticación y luego entrega el archivo al cliente una vez autenticado.

Por ejemplo:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^uploads/. /serve-protected-file.php [L]

Cualquier solicitud de /uploads/<something>(. Por ejemplo /uploads/2020/02/myfile.pdf), que se asigna a un archivo válido se encamina a su guión: /serve-protected-file.php.

/serve-protected-file.php entonces necesitaría hacer algo como lo siguiente:

// 1. Parse the file being requested from REQUEST_URI

// 2. Is the requested file "protected"?
//    (Serving both protected and public files from the same directory?)

// 3. If not protected then serve/stream the resource to the client. END

// 4. If protected then authenticate the user...

// 5. If user authenticated then serve/stream the resource to the client. END

// 6. Resource is protected and user not authenticated...
//    Serve a 403 Forbidden. END

(Idealmente, la ubicación de estos recursos "protegidos" estaría completamente fuera de la raíz del documento, por lo que son "privados" de forma predeterminada, y la URL que el usuario usa para acceder a estos recursos es completamente virtual, entonces probablemente no necesitaría cualquier codificación adicional .htaccessy todo sería implementado por su controlador frontal, pero todo depende de cómo se implemente su sitio y la forma en que se enrutan las URL).