Solución sencilla para restringir el acceso a (algunas) subidas/descargas
Situación inicial
Para un sitio que estoy configurando, investigué sobre cómo proteger subidas/descargas y restringir el acceso según roles/capacidades de usuario. Por supuesto, he leído algunas preguntas anteriores relacionadas con este tema (en general), como referencia las más importantes/interesantes que encontré:
- ¿Cómo proteger subidas si el usuario no está logueado?
- ¿Cómo restringir acceso a archivos subidos?
- Restringir acceso a archivos dentro de una carpeta específica
- ¿Cómo hacer que los archivos multimedia sean privados?
- Integrar script PHP de descarga en `functions.php`
Notas adicionales
Generalmente no es mala idea mejorar la seguridad de tu instalación de WordPress - por ejemplo protegiendo tu wp-config.php
- hay muchas cosas que puedes y deberías hacer. Existe mucha información sobre cómo hacerlo. En el contexto de esta pregunta me preocupo principalmente por mis subidas/descargas.
Las subidas de WordPress no están aseguradas, cualquiera puede navegar la carpeta uploads
, a menos que lo prevengas con un .htaccess
:
Options All -Indexes
El archivo .htaccess
debe colocarse dentro de la carpeta uploads
. Pero eso no las protege realmente, solo hace más difícil encontrar los archivos. Adicionalmente puedes prevenir hotlinking
, restringiendo acceso basado en referrer
- aunque es un caso algo diferente, lo menciono, no profundizaré, puedes encontrar mucha información al respecto.
Por supuesto existe la posibilidad de hacer posts privados o crear un tipo de post personalizado con plantillas adecuadas para hacerlo privado, pero eso no protege tus archivos. Lo mismo puede decirse de envolver los archivos en condicionales como is_user_logged_in()
o is_admin()
.
Como nota al margen, existen muchos plugins que prometen proteger tus archivos, pero muchos solo aparentan hacerlo, por algunas de las razones mencionadas. Solo lo menciono porque estoy seguro que no todos lo saben - así que, tenganlo en cuenta.
Objetivo
Mi intención era poder restringir el acceso a (algunas) subidas y respectivamente descargas. Y asegurarme que nadie no deseado pudiera acceder a ellas, ni por casualidad ni si alguien conociera el nombre del archivo, los archivos deberían ser realmente privados y seguros. Después de todo solo ciertas personas deberían tener acceso sin excepciones.
Adicionalmente no necesitaba privatizar todo el sitio, de hecho sería contraproducente - se usa para presentaciones públicas. Además quería que la solución fuera fácil de usar, por la simple razón de que algunas personas que trabajan con esto no son expertas en computadoras, como suele ser el caso.
Pregunta
De ahí la pregunta, ¿existe una forma (relativamente) sencilla de restringir el acceso a (algunas) subidas y sus respectivas descargas? Y como expliqué, eso significa una forma de protegerlos y asegurarlos realmente?

Estoy respondiendo a mi propia pregunta porque encontré una solución, pero estoy realmente interesado en sus opiniones al respecto. O tal vez tienen una solución mucho mejor, si es así, me encantaría escucharla.
Resultados de la investigación
Mis resultados de investigación fueron:
1. Obtener los archivos fuera del directorio raíz, carpeta www
;
2. Denegar cualquier acceso directo a la carpeta que contiene los archivos;
3. Dejar que un script maneje las solicitudes de los archivos;
Las fuentes de esos puntos están -al menos en su mayoría- incluidas en mi pregunta.
Solución
- Instalé el plugin »wp-downloadmanager«
- se creará una carpeta llamada
files
dentro dewp-content
en el proceso;
- se creará una carpeta llamada
- Agregué un archivo
.htaccess
a la nueva carpetafiles
:- contenido del
.htaccess
:
Options All -Indexes
Order Deny,Allow
Deny from all
- contenido del
- Cambié una opción importante del plugin:
- la opción a la que me refiero es
método de descarga
; - la cambié a
output file
(archivo de salida);
- la opción a la que me refiero es
- Agregué algunos archivos a través de la interfaz del plugin:
- hay una opción llamada
permitido descargar
; - que permite restringir el acceso según el rol/capacidad del usuario;
- hay una opción llamada
- Hice algunas pruebas:
- no hay acceso directo a los archivos -ni a través de la barra de direcciones ni con wget;
- las descargas públicas se pueden alcanzar a través de sus enlaces permanentes - elegí »nice permalinks: yes« y »download url: file id« en el panel de opciones - la barra de direcciones/wget también funciona;
- las descargas protegidas y restringidas solo son accesibles si se inicia sesión como un usuario con los roles/capacidades correctas;
Reflexiones finales
Creo que la solución sigue bastante los resultados de la investigación. Aparte de colocar los archivos afuera. Pero restringir el acceso a/proteger el directorio y dejar que un script maneje las solicitudes de archivos se cumple. La restricción de acceso la maneja el .htaccess
y el script en este caso es el plugin wp-downloadmanger
.
Notas adicionales
- es absolutamente necesario cambiar el
método de descarga
aoutput file
(archivo de salida) y, por supuesto, es un requisito que el archivo
.htaccess
esté en su lugarpara verificar que el plugin asume el rol del script, eche un vistazo a
wp-downloadmanger.php
- aproximadamente de las líneas 207 a 227 (versión 1.6.1); esto se entiende como un punto complementario a la información enlazada
