Solución sencilla para restringir el acceso a (algunas) subidas/descargas

28 may 2013, 00:50:54
Vistas: 18.3K
Votos: 16

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é:

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?

4
Comentarios

Deberías agregar tu solución como una respuesta en lugar de incrustarla en la pregunta.

s_ha_dum s_ha_dum
28 may 2013 02:00:39

Y por favor usa mayúsculas y minúsculas correctamente. Se lee como un chat...

kaiser kaiser
29 may 2013 00:25:10

Gracias por la crítica constructiva, la editaré y reestructuraré pronto.

Nicolai Grossherr Nicolai Grossherr
29 may 2013 00:36:24

Tengo curiosidad, ¿qué opinas sobre este plugin? https://preventdirectaccess.com/faq/

Sam Sabin Sam Sabin
28 ene 2025 03:54:29
Todas las respuestas a la pregunta 1
0

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

  1. Instalé el plugin »wp-downloadmanager«
    • se creará una carpeta llamada files dentro de wp-content en el proceso;
  2. Agregué un archivo .htaccess a la nueva carpeta files:
    • contenido del .htaccess:
      Options All -Indexes
      Order Deny,Allow
      Deny from all
  3. 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);
  4. 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;
  5. 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 a output file (archivo de salida)
  • y, por supuesto, es un requisito que el archivo .htaccess esté en su lugar

  • para 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

30 may 2013 02:37:57