Comment refuser l'accès à un fichier dans .htaccess

112

J'ai le fichier .htaccess suivant:

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

J'essaie d'interdire aux visiteurs d'accéder au fichier suivant:

domain.com/inscription/log.txt

mais ce que j'ai ci-dessus ne fonctionne pas: je peux toujours accéder au fichier à distance depuis le navigateur.

Timothée HENRY
la source

Réponses:

187

Dans un fichier htaccess, la portée de la <Files>directive ne s'applique qu'à ce répertoire (je suppose pour éviter toute confusion lorsque les règles / directives dans htaccess des sous-répertoires sont appliquées en remplaçant celles du parent).

Vous pouvez donc avoir:

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

Pour Apache 2.4+, vous utiliseriez:

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

Dans un fichier htaccess de votre inscriptionrépertoire. Ou vous pouvez utiliser mod_rewrite pour gérer les deux cas de refus d'accès au fichier htaccess ainsi qu'à log.txt:

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

RewriteRule ^/?inscription/log\.txt$ - [F,L]
Jon Lin
la source
Si vous utilisez IIS, faites-le plutôt dans le fichier web.config.
Shaun Luttin
1
L'utilisation des règles de réécriture empêche mon propre code d'accéder au contenu de * .txt. Comment contourneriez-vous cela?
Pantalons
8
"le champ d'application de la <Files>directive ne s'applique qu'à cet annuaire" - non. Cela s'applique à ce répertoire et à tous les sous-répertoires en dessous. Alors <Files "log.txt">va attraper /log.txt et /inscription/log.txt .
MrWhite
1
Pouvez-vous mettre à jour cette réponse car elle Order Allow,Denyest obsolète dans la version 2.4?
Telarian
18

Correspondance de motif forte - C'est la méthode que j'utilise ici chez Perishable Press. En utilisant une forte correspondance de motifs, cette technique empêche l'accès externe à tout fichier contenant « .hta », « .HTA » ou toute combinaison insensible à la casse de ceux-ci. Pour illustrer, ce code empêchera l'accès via l'une des demandes suivantes:

  • .htaccess
  • .HTACCÈS
  • .hTaCcEsS
  • testFILE.htaccess
  • nom de fichier.HTACCESS
  • FILEROOT.hTaCcEs

..etc., etc. De toute évidence, cette méthode est très efficace pour sécuriser les fichiers HTAccess de votre site. En outre, cette technique inclut également la directive fortifiante « Satisfy All ». Notez que ce code doit être placé dans le fichier racine HTAccess de votre domaine:

# STRONG HTACCESS PROTECTION
<Files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>
Yaşar Xavan
la source
1
J'obtiens une erreur de serveur interne 500 lors de l'utilisation de ce code. Une idée pourquoi? J'utilise Wordpress.
Keryn Gill
8
Ne serait-il pas plus logique de simplement interdire aux utilisateurs d'accéder aux fichiers dotfiles? En utilisant quelque chose comme <Files ~"^\..*">.
Steen Schütt
1
Besoin d'un espace entre le tilde et le premier guillemet - au moins pour moi j'en avais besoin. ~ SPACE "
Art Geigel
J'ai obtenu le même comportement en désactivant .files: <filesMatch "^ \ .. *"> order allow, deny deny from all </FilesMatch>
Pinonirvana
14

Je ne pense pas que la réponse actuellement acceptée soit correcte. Par exemple, j'ai le .htaccessfichier suivant à la racine d'un serveur virtuel (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>

Cela empêche l'accès externe à reminder.phpqui se trouve dans un sous-répertoire. J'ai un .htaccessfichier similaire sur mon serveur Apache 2.2 avec le même effet:

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

Je ne sais pas avec certitude mais je soupçonne que c'est la tentative de définir le sous-répertoire spécifiquement dans le .htaccessfichier, c'est-à - dire<Files ./inscription/log.txt> qui provoque son échec. Il serait plus simple de mettre le .htaccessfichier dans le même répertoire que log.txtie dans le inscriptionrépertoire et cela fonctionnera là-bas.

Nik Dow
la source
1
Vous obtenez mon vote positif, cela a également fonctionné pour mon apache 2.4.
Tschallacka
3

Placez la ligne ci-dessous dans votre fichier .htaccess et remplacez le nom du fichier comme vous le souhaitez

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

Eh bien, vous pouvez utiliser la <Directory>balise par exemple:

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

Ne pas utiliser ./car si vous utilisez simplement, /il regarde le répertoire racine de votre site.

Pour un exemple plus détaillé, visitez http://httpd.apache.org/docs/2.2/sections.html

Nicholas anglais
la source
2
Mais un <Directory>conteneur n'est pas autorisé .htaccess. Dans .htaccess, le .htaccessfichier lui-même est le " conteneur de répertoire " (fichier de configuration par répertoire).
MrWhite
Eh bien, vous pouvez utiliser la redirection. Redirect /inscription/log.txt access_denied.htmlCela redirigera l'utilisateur vers access_denied.htmlsi l'utilisateur se rend inscription/log.txtdans le répertoire d'inscription.
Nicholas English