Cómo denegar el acceso a un archivo en .htaccess

112

Tengo el siguiente archivo .htaccess:

RewriteEngine On
RewriteBase /

# Protect the htaccess file
<Files .htaccess>
Order Allow,Deny
Deny from all
</Files>

# Protect log.txt
<Files ./inscription/log.txt>
Order Allow,Deny
Deny from all
</Files>

# Disable directory browsing
Options All -Indexes

Estoy intentando prohibir que los visitantes accedan al siguiente archivo:

domain.com/inscription/log.txt

pero lo que tengo arriba no funciona: todavía puedo acceder al archivo desde el navegador de forma remota.

Timothée HENRY
fuente

Respuestas:

187

Dentro de un archivo htaccess, el alcance de la <Files>directiva solo se aplica a ese directorio (supongo que para evitar confusiones cuando las reglas / directivas en el htaccess de los subdirectorios se aplican reemplazando a las del padre).

Entonces puedes tener:

<Files "log.txt">  
  Order Allow,Deny
  Deny from all
</Files>

Para Apache 2.4+, usaría:

<Files "log.txt">  
  Require all denied
</Files>

En un archivo htaccess en su inscriptiondirectorio. O puede usar mod_rewrite para manejar ambos casos denegar el acceso al archivo htaccess y al log.txt:

RewriteRule /?\.htaccess$ - [F,L]

RewriteRule ^/?inscription/log\.txt$ - [F,L]
Jon Lin
fuente
Si usa IIS, hágalo en el archivo web.config.
Shaun Luttin
1
El uso de las reglas de reescritura impide que mi propio código acceda al contenido de * .txt. ¿Cómo solucionaría esto?
Pantalones
8
"el alcance de la <Files>directiva solo se aplica a ese directorio", no, no es así. Se aplica a ese directorio y a todos los subdirectorios debajo de él. Así <Files "log.txt">que atrapará /log.txt y /inscription/log.txt .
MrWhite
1
¿Puede actualizar esta respuesta ya que Order Allow,Denyestá obsoleta en 2.4?
Telarian
18

Fuerte coincidencia de patrones : este es el método que utilizo aquí en Perishable Press. Usando una fuerte coincidencia de patrones, esta técnica evita el acceso externo a cualquier archivo que contenga " .hta ", " .HTA " o cualquier combinación de los mismos que no distinga entre mayúsculas y minúsculas. A modo de ilustración, este código impedirá el acceso a través de cualquiera de las siguientes solicitudes:

  • .htaccess
  • .HTACCESS
  • .hTaCcEsS
  • testFILE.htaccess
  • filename.HTACCESS
  • FILEROOT.hTaCcEsS

..etc., etc. Claramente, este método es muy eficaz para proteger los archivos HTAccess de su sitio. Además, esta técnica también incluye la directiva fortalecedora " Satisfacer a todos ". Tenga en cuenta que este código debe colocarse en el archivo HTAccess raíz de su dominio:

# STRONG HTACCESS PROTECTION
<Files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>
Yaşar Xavan
fuente
1
Recibo un error de servidor interno 500 cuando uso este código. ¿Alguna idea de por qué? Estoy usando Wordpress.
Keryn Gill
8
¿No tendría más sentido simplemente no permitir que los usuarios accedan a los archivos dotfiles? Usando algo como <Files ~"^\..*">.
Steen Schütt
1
Necesito un espacio entre la tilde y la primera comilla, al menos para mí lo necesitaba. ~ SPACE "
Art Geigel
Obtuve el mismo comportamiento al deshabilitar .files: <filesMatch "^ \ .. *"> order allow, deny deny from all </FilesMatch>
Pinonirvana
14

No creo que la respuesta aceptada actualmente sea correcta. Por ejemplo, tengo el siguiente .htaccessarchivo en la raíz de un servidor virtual (apache 2.4):

<Files "reminder.php">
require all denied
require host localhost
require ip 127.0.0.1
require ip xxx.yyy.zzz.aaa
</Files>

Esto evita el acceso externo al reminder.phpque se encuentra en un subdirectorio. Tengo un .htaccessarchivo similar en mi servidor Apache 2.2 con el mismo efecto:

<Files "reminder.php">
        Order Deny,Allow
        Deny from all
        Allow from localhost
        Allow from 127.0.0.1
     Allow from xxx.yyy.zzz.aaa
</Files>

No lo sé con certeza, pero sospecho que es el intento de definir el subdirectorio específicamente en el .htaccessarchivo, es decir , lo <Files ./inscription/log.txt>que está causando que falle. Sería más sencillo poner el .htaccessarchivo en el mismo directorio que, por log.txtejemplo, en el inscriptiondirectorio y funcionará allí.

Nik Dow
fuente
1
Obtienes mi voto a favor, esto también funcionó para mi apache 2.4.
Tschallacka
3

Coloque la siguiente línea en su archivo .htaccess y reemplace el nombre del archivo como desee

RewriteRule ^(test\.php) - [F,L,NC]
Rakesh Dongarwar
fuente
-4

Bueno, podrías usar la <Directory>etiqueta, por ejemplo:

<Directory /inscription>
  <Files log.txt>
    Order allow,deny
    Deny from all
  </Files>
</Directory>

No lo use ./porque si solo lo usa /busca en el directorio raíz de su sitio.

Para obtener un ejemplo más detallado, visite http://httpd.apache.org/docs/2.2/sections.html

Nicholas English
fuente
2
Pero <Directory>no se permite la entrada de un contenedor .htaccess. En .htaccess, el .htaccessarchivo en sí es el " contenedor de directorio " (archivo de configuración por directorio).
MrWhite
Bueno, entonces podrías usar Redirect. Redirect /inscription/log.txt access_denied.htmlEsto redirigirá al usuario a access_denied.htmlsi el usuario accede al inscription/log.txtdirectorio de inscripción.
Nicholas English