26 votes

Comment refuser au web l'accès à certains fichiers ?

Je dois faire une opération un peu étrange.

Tout d'abord, je fonctionne sous Debian, avec apache2 (qui "tourne" en tant qu'utilisateur www-data).

J'ai donc un simple fichier texte avec une extension .txt ou .ini, ou autre, peu importe.

Ces fichiers sont situés dans des sous-dossiers dont la structure est la suivante :

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

donc, le nom du fichier est toujours le même, idem pour la 'hiérarchie', il suffit de changer le nom du dossier : /nom-dossier-statique/nom-dossier-dinamyc/file-name-static.txt

Ce que je dois faire est (je pense) relativement simple : Je dois pouvoir lire ce fichier par des programmes sur le serveur (Python, php par exemple), mais si j'essaie de récupérer le contenu du fichier par broswer (en creusant l'url www.example.com/folder1/car/foobar.txt, ou via cUrl, etc.) je dois obtenir une erreur interdite, ou autre, mais ne pas accéder au fichier .

Ce serait également bien que même l'accès à ces fichiers via FTP soit "caché", ou de toute façon ne puisse pas être téléchargé (du moins ce que j'utilise avec la racine ftp et les données utilisateur).

Comment puis-je faire ?

J'ai trouvé ça en ligne, à mettre dans le fichier .htaccess :

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

Cela semble fonctionner, mais uniquement si le fichier se trouve à la racine du site (www.example.com / monfichier.txt), et non dans des sous-dossiers. De plus, les dossiers du deuxième niveau (www.example.com/folder1/ fruit /foobar.txt) sera créé de manière dynamique J'aimerais éviter de devoir modifier le fichier .htaccess de temps en temps.

Il est possible de créer une règle, quelque chose comme ça, qui s'applique à tous les fichiers portant un nom donné, qui se trouve sur *www.example.com/folder-name-static/. *dossier-nom-dinamyc/***file-nom-static.txt*, où ces parties sont toujours les mêmes juste **cette modification ?

EDIT :

Comme Dave Drager l'a dit, je pourrais simplifier les choses en gardant ces fichiers en dehors du répertoire accessible par le web. Mais ces répertoires contiendront aussi d'autres fichiers, des images, et d'autres choses utilisées par mes utilisateurs, donc j'essaie simplement de ne pas avoir un système de dossiers en double, par exemple :

/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

36voto

rkthkr Points 8463

Vous pourriez utiliser Fichiers / FilesMatch et une expression régulière :

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

C'est ainsi que le fichier .htpasswd est protégé.

ou rediriger tout accès de .txt vers un 404 :

RedirectMatch 404 \.txt$

0 votes

J'ai essayé d'utiliser cette méthode, mais il semble que cela ne fonctionne pas pour les fichiers dans les sous-dossiers.

0 votes

J'ai corrigé mes regexps, désolé...

0 votes

Ok ça peut marcher. Mais le regexp devrait être comme RedirectMatch 404 \myfilename.txt $, n'est-ce pas ? Les fichiers auront toujours le même nom, mais dans des dossiers différents. Et cette solution n'affectera pas la méthode FTP, n'est-ce pas ?

3voto

ebichuhamster Points 153

De la Commandez section documentation :

Les mots-clés ne peuvent être séparés que par une virgule ; aucun espace n'est autorisé entre eux.

Ce qui suit est donc incorrect :

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

Le texte suivant est (plus) correct

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

2voto

Rikalous Points 2996

Oui, tout cela est possible. Cependant, si vous avez des programmes sur le serveur qui ont besoin d'accéder à des fichiers texte, ils doivent résider en dehors de la racine web. Par exemple, si vos fichiers web se trouvent dans ~/public_html/, vous devez les stocker dans ~/data. Il n'y a aucune raison de les placer dans le dossier public html.

En plus de les supprimer du dossier web, assurez-vous que les permissions unix sont correctement définies sur eux. L'utilisateur des scripts devrait avoir un accès en lecture (écriture ?) mais n'importe qui d'autre ne doit pas avoir cet accès.

Si vous avez vraiment besoin que ces fichiers se trouvent dans un dossier accessible sur le Web, il existe des moyens de faire ce que vous demandez via mod_rewrite. Consultez le site suivant pour de nombreux exemples, dont l'un devrait convenir.

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

0 votes

Les fichiers seront créés via Python ou php, puis, jamais plus édités, juste lus.

0voto

scotchi Points 101

Pourquoi ne pas utiliser les permissions standard des fichiers Unix pour refuser l'accès au fichier ?

Il y a une explication décente sur Wikipedia à propos de Permissions des fichiers Unix

0 votes

Comment puis-je définir les permissions pour que php, Python, l'utilisateur root manipule ces fichiers et que les navigateurs n'y aient pas accès ?

0 votes

En tant qu'éditeur sur Wikipédia depuis 2004, je conseille de ne rien croire de ce qui s'y trouve sans vérifier d'autres sources.

0voto

Matt Simmons Points 20098

Placez le fichier .htaccess dans le sous-répertoire et dans la déclaration, définissez AllowOverride All.

0 votes

Donc j'aurai besoin d'un .htaccess pour chaque dossier de 2° niveau ? mmh cela peut être une solution ce serait mieux avec 1 .htacces

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X