¿Cómo denegar el acceso web a algunos archivos?


13

Necesito hacer una operación un poco extraña.

Primero, ejecuto en Debian, apache2 (que 'se ejecuta' como usuario www-data)

Entonces, tengo un archivo de texto simple con .txt ot .ini, o cualquier extensión, no importa.

Estos archivos se encuentran en subcarpetas con una estructura como esta:

www.example.com/folder1/car/foobar.txt www.example.com/folder1/cycle/foobar.txt www.example.com/folder1/fish/foobar.txt www.example.com/folder1/fruit/foobar .TXT

por lo tanto, el nombre del archivo siempre es el mismo, lo mismo para la 'jerarquía', solo cambie el nombre de la carpeta: /folder-name-static/folder-name-dinamyc/file-name-static.txt

Lo que debería hacer es (creo) relativamente simple: debo poder leer ese archivo por programas en el servidor (python, php, por ejemplo), pero si trato de recuperar el contenido del archivo por broswer (digitando la url www. example.com/folder1/car/foobar.txt, o vía cUrl, etc.) Debo obtener un error prohibido, o lo que sea, pero no acceder al archivo .

También sería bueno que incluso el acceso a esos archivos a través de FTP estén 'ocultos', o de todos modos no se puedan descargar (al menos eso uso con la raíz ftp y los datos del usuario)

¿Como lo puedo hacer?

Encontré esto en línea, se puso en el archivo .htaccess:

<Files File.txt>
 Order allow, deny
 Deny from all
</ Files>

Parece funcionar, pero solo si el archivo está en la raíz web (www.example.com / myfile.txt), y no en subcarpetas. Además, las carpetas en el segundo nivel (www.example.com/folder1/ fruit /foobar.txt) se crearán dinámicamente. Me gustaría evitar tener que cambiar el archivo .htaccess de vez en cuando.

Es posible crear una regla, algo así, que se aplica a todos los archivos con nombre, que está en * www.example.com / folder-name-static / * folder-name-dinamyc / *** file-name -static.txt *, donde esas partes son siempre iguales , solo ** ¿ese cambio ?

EDITAR :

Como dijo Dave Drager, podría ejemplificar esto manteniendo esos archivos fuera del directorio web accesible. Pero esos directorios también contendrán otros archivos, imágenes y cosas utilizadas por mis usuarios, así que simplemente trato de no tener un sistema de carpetas duplicadas, como:

/var/www/vhosts/example.com/httpdocs/folder1/car/[other folders and files here]
/var/www/vhosts/example.com/httpdocs/folder1/cycle/[other folders and files here]
/var/www/vhosts/example.com/httpdocs/folder1/fish/[other folders and files here]

//and, then for the 'secrets' files:

/folder1/data/car/foobar.txt
/folder1/data/cycle/foobar.txt
/folder1/data/fish/foobar.txt

Respuestas:


20

Puede usar Files / FilesMatch y una expresión regular:

<Files ~ "\.txt$">
    Order allow,deny
    Deny from all
</Files>

Así es como se protege .htpasswd.

o redirigir cualquier acceso de .txt a un 404:

RedirectMatch 404 \.txt$

He probado a utilizar de esa manera, pero parece que no haga trabaja en los archivos de las subcarpetas
Straße

Arreglé mis expresiones regulares, lo siento ...
#

ok ... puede funciona. Pero ... la expresión regular debería ser como RedirectMatch 404 \ myfilename.txt $, ¿verdad? Los archivos siempre tendrán el mismo nombre, pero en diferentes carpetas. Y esta solución no afectará el método FTP, ¿verdad?
Strae

Eso parece correcto ...
#

Sí, confirmo que funciona ... pero mi regexp RedirectMatch 404 \ myfilename.txt $ debe estar equivocado ... funciona si uso RedirectMatch 404 \ .txt $, bloqueando todos los archivos .txt, pero no si uso el nombre de archivo en la expresión regular. ¿Alguna ayuda? im not a genuis with regexp;)
Strae

1

Sí, todo esto es posible. Sin embargo, si tiene programas en el servidor que necesitan acceder a archivos de texto, deben residir fuera de la raíz web. Por ejemplo, si sus archivos web están en ~ / public_html /, debe almacenarlos en ~ / data. No hay razón para colocarlos en la carpeta pública html.

Además de eliminarlos de la carpeta web, asegúrese de que los permisos de Unix estén configurados correctamente en ellos. El usuario de los scripts necesitaría tener acceso de lectura (¿escritura?), Pero nadie más tiene que tener este acceso.

Si necesita tener estos archivos en una carpeta accesible desde la web, hay formas de hacer lo que está pidiendo a través de mod_rewrite. Consulte el sitio siguiente para ver muchos ejemplos, uno de los cuales debe ajustarse a la factura.

http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/


Los archivos se crearán a través de python o php, luego, nunca se volverán a editar, solo hay que leerlos.
Strae

0

¿Por qué no usar los permisos estándar de archivos Unix para negar el acceso al archivo?

Hay una explicación decente en wikipedia sobre los permisos de archivos Unix


¿Cómo puedo establecer permisos para permitir que php, python, usuario root manejen esos archivos y el acceso a los navegadores no?
Strae

0

Coloque el archivo .htaccess en el subdirectorio y en la instrucción, establezca AllowOverride All


Entonces, ¿necesitaré un .htaccess para cada carpeta de 2 ° nivel? mmh .. puede ser una solución .. sería mejor con 1 .htacces ..
Strae


0

Después de leerlos a todos, noté que el archivo .htaccess puede ser el camino para mí: solo afecta los archivos en la carpeta donde está.

Pero mis carpetas se generan dinámicamente. No creo que copiar el archivo .htaccess o volver a crearlo cada vez que creo una nueva carpeta sea una forma confiable.

Como dijo Dave, la forma lógica debería ser almacenar los archivos de texto de configuración fuera de la carpeta accesible desde la web.

Pero en cada carpeta tengo que almacenar otros archivos, imágenes, por ejemplo, que deben ser accesibles para la web ... y todavía no creo que replicar la estructura de carpetas, dentro y fuera del directorio raíz de la web, también sea una forma confiable . Por lo tanto, necesitaré cambiar incluso la configuración de apache para incluir la carpeta de configuración en la ruta permitida de php ... de todos modos, esto no debería ser un problema.

Entonces, si no tengo el mejor , tengo que elegir el peor .

Usaré la solución de archivos múltiples .htaccess, por ahora, esperando no tener remordimientos en el futuro.

Cualquier otra solución es apreciada.


0

Desde la sección de documentación del pedido :

Las palabras clave solo pueden estar separadas por una coma; no se permiten espacios en blanco entre ellos.

Entonces lo siguiente es incorrecto:

<Files File.txt>
Order allow, deny
Deny from all
</ Files>

Lo siguiente es (más) correcto

<Files "File.txt">
Order allow,deny
Deny from all
</Files>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.