web-dev-qa-db-fra.com

Refuser l'accès à des types de fichiers spécifiques dans un répertoire spécifique

Pour certaines applications, les utilisateurs peuvent télécharger leurs propres fichiers. Comme il peut s'agir de fichiers très volumineux, ils sont autorisés à les télécharger via leur propre client FTP.

Bien sûr, je ne voudrais pas qu'ils téléchargent des fichiers PHP avec lesquels ils peuvent accéder à tous les autres fichiers sur le serveur. L'une des façons dont je veux empêcher ce comportement est de refuser l'accès à certains les types de fichiers (comme php, rb, py, etc.) uniquement dans ces dossiers.

J'ai trouvé des moyens de refuser l'accès aux dossiers, aux fichiers, aux fichiers dans les dossiers, mais rien sur les types de fichiers dans les dossiers.

J'ai essayé de combiner ce que j'ai trouvé, comme:

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

changer pour

<Files uploads/ "\.inc$">
Order allow,deny
Deny from all
</Files>

ou d'autres moyens

RewriteRule ^(\.php) - [F,L,NC] 

à

RewriteRule ^(uploads/\.php) - [F,L,NC]

Cependant, je ne peux pas savoir quelle syntaxe je dois utiliser.

Ainsi, par exemple, je pourrais avoir ce qui suit (exemple de base):

/index.php
/uploads/
  hack.php
  hack.rb
  hack.py
  pony.jpg

Je veux que hack.php/rb/py ne soit pas disponible, mais que tout le reste soit disponible. Quelle syntaxe dois-je utiliser?

20
Dennis

La directive FilesMatch fonctionne uniquement sur les noms de fichiers. Il ne regarde pas du tout la partie du chemin.

Si vous souhaitez spécifier des directives dans le fichier racine .htaccess pour contrôler un sous-répertoire, vous pouvez utiliser mod_rewrite .

Essaye ça:

RewriteRule ^uploads/.*\.(php|rb|py)$ - [F,L,NC]

Ce qui précède bloquera tout nom de fichier se terminant par .php ou .rb ou .py dans le répertoire/uploads ou ses sous-répertoires. Par exemple, il bloquera:

  • /uploads/something.php
  • /uploads/something/more.php

Notez qu'il n'y a pas de barre oblique dans la règle de réécriture. Le chemin que vous devez utiliser dans la directive sera différent selon son emplacement. La directive ci-dessus, si elle est placée dans le fichier .htaccess de la racine du document, fonctionnera pour les fichiers dans un répertoire appelé uploads qui se trouve directement sous la racine du document.

Bien que ce qui précède réponde à votre question, il serait plus sûr d'autoriser uniquement des fichiers spécifiques plutôt que d'essayer de bloquer les fichiers. Souvent, un serveur exécutera des fichiers avec des extensions autres que celles que vous avez répertoriées.

Vous pouvez faire quelque chose comme ça:

RewriteCond %{REQUEST_URI} ^/uploads [NC]
RewriteCond %{REQUEST_URI} !\.(jpe?g|png|gif)$ [NC]
RewriteRule .* - [F,L]

Avec ce qui précède, si l'URI de demande commence par/uploads mais ne se termine pas par l'une des extensions spécifiées, alors il est interdit. Vous pouvez modifier les extensions en fonction de vos besoins. Mais de cette façon, vous pouvez autoriser les extensions selon vos besoins plutôt que de découvrir trop tard que vous avez manqué d'en bloquer une.

Cette règle (à partir de votre question)

RewriteRule ^(uploads/\.php) - [F,L,NC]

va bloquer

  • /uploads/.php
  • /uploads/.phpmore

mais il ne permet rien entre le nom du répertoire et l'extension de fichier.

Si vous allez utiliser des règles de rewirte, vous voudrez peut-être en savoir plus sur regexp. Je me réfère souvent à www.regular-expressions.info quand j'ai besoin de rechercher quelque chose.

18
toxalot

Vous pouvez mettre un .htaccess dans le répertoire upload. Les directives s'appliqueront alors uniquement à ce répertoire et aux répertoires ci-dessous. Voir Comment les directives sont appliquées pour plus de détails.

Ainsi, un .htaccess avec FilesMatch peut restreindre l'accès aux fichiers correspondant à *.inc, *.php et ainsi de suite, lorsqu'il se trouve dans le répertoire public

<FilesMatch "\.(?:inc|php|py|rb)$">
Order allow,deny
Deny from all
</FilesMatch>
22
Olaf Dietsche

Vous pouvez utiliser la solution la plus simple et la plus simple pour refuser l'accès aux types de fichiers certen:

RedirectMatch 403 ^/folder/.+\.(png|gif|js)$

Cela renverra une erreur d'accès interdit 403 pour les clients s'ils essaient d'accéder à / folder/file.extension.

0
starkeen