Comment refuser l'accès Web à certains fichiers?

13

J'ai besoin de faire une opération un peu étrange.

Tout d'abord, je tourne sur Debian, apache2 (qui 'tourne' en tant qu'utilisateur www-data)

Donc, j'ai un simple fichier texte avec .txt ou .ini, ou n'importe quelle extension, n'a pas d'importance.

Ces fichiers sont situés dans des sous-dossiers avec une structure comme celle-ci:

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

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

Ce que je devrais faire est (je pense) relativement simple: je dois être capable de 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 digérant l'url www. example.com/folder1/car/foobar.txt, ou via cUrl, etc.) Je dois obtenir une erreur interdite, ou autre chose, mais pas accéder au fichier .

Il serait également agréable que même l'accès à ces fichiers via FTP soit «caché», ou de toute façon ne puisse pas être téléchargé (au moins que j'utilise avec la racine ftp et les données utilisateur)

Comment puis-je faire?

Je l'ai trouvé en ligne, mettez-le dans le fichier .htaccess:

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

Il semble fonctionner, mais uniquement si le fichier se trouve à la racine Web (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) seront créés de manière dinamyque. Je voudrais éviter d'avoir à changer de temps en temps le fichier .htaccess.

Il est possible de créer une règle, quelque chose comme ça, qui va pour tous les fichiers avec un nom donné, qui est sur * www.example.com / nom-dossier-statique / * nom-dossier-dinamyc / *** nom-fichier -static.txt *, où ces parties sont toujours les mêmes , juste ** que l'on change ?

MODIFIER :

Comme l'a dit Dave Drager, je pourrais illustrer cela en gardant ces fichiers en dehors du répertoire accessible sur le Web. Mais ces répertoires contiendront également d'autres fichiers, des images et des trucs utilisés par mes utilisateurs, donc j'essaie simplement de ne pas avoir de système de dossiers en double, comme:

/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
Strae
la source

Réponses:

20

Vous pouvez utiliser Files / FilesMatch et une expression régulière:

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

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

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

RedirectMatch 404 \.txt$
rkthkr
la source
J'ai essayé d'utiliser de cette façon, mais il semble que cela ne fonctionne pas sur le fichier dans les sous-dossiers
Strae
J'ai corrigé mes regexps, désolé ...
rkthkr
ok .. peut fonctionner. Mais .. l'expression rationnelle devrait être comme RedirectMatch 404 \ myfilename.txt $, non? Les fichiers seront toujours du même nom, mais dans des dossiers différents. Et cette solution n'affectera pas la méthode FTP, non?
Strae
Cela semble correct ...
rkthkr
Oui, je confirme que cela fonctionne ... mais mon expression rationnelle RedirectMatch 404 \ myfilename.txt $ doit être erronée .. cela fonctionne si j'utilise RedirectMatch 404 \ .txt $, bloquant tous les fichiers .txt, mais pas si j'utilise le nom de fichier dans l'expression rationnelle. De l'aide? im not a genuis with regexp;)
Strae
1

Oui, tout cela est possible. Cependant, si vous avez sur le serveur des programmes qui doivent accéder à des fichiers texte, ils doivent résider hors 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 html public.

En plus de les supprimer du dossier Web, assurez-vous que les autorisations Unix sont correctement définies sur eux. L'utilisateur des scripts devrait avoir un accès en lecture (écriture?) Mais personne d'autre ne doit avoir cet accès.

Si vous avez besoin d'avoir ces fichiers dans un dossier accessible sur le Web, il existe des moyens de faire ce que vous demandez via mod_rewrite. Voir le site suivant pour de nombreux exemples, dont l'un devrait convenir à la facture.

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

Dave Drager
la source
Les fichiers seront créés via python ou php, puis, jamais modifiés à nouveau, il suffit de les lire.
Strae
0

Pourquoi ne pas utiliser les autorisations de fichier Unix standard pour refuser l'accès au fichier?

Il y a une explication décente sur wikipedia sur les autorisations de fichiers unix

cyberkni
la source
Comment puis-je définir des autorisations pour laisser php, python, l'utilisateur root gérer ces fichiers et les navigateurs-pas d'accès?
Strae
0

Placez le fichier .htaccess dans le sous-répertoire et dans l'instruction, définissez AllowOverride All

Matt Simmons
la source
J'ai donc besoin d'un .htaccess pour chaque dossier de niveau 2 °? mmh .. peut être une solution .. serait mieux avec 1 .htacces ..
Strae
0

Vous pouvez utiliser des ACL Linux .

Alakdae
la source
Istn que les autorisations de fichiers simples? comme rwx? Comment puis-je faire ce dont j'ai besoin avec ça?
Strae
0

Après vous avoir tous lu, j'ai remarqué que le fichier .htaccess peut être le chemin pour moi: n'affecte que les fichiers du dossier où il se trouve.

Mais mes dossiers sont générés dynamiquement. Je ne pense pas que copier le fichier .htaccess ou le recréer chaque fois que je crée un nouveau dossier soit un moyen fiable.

Comme l'a dit Dave, la manière logique devrait être de stocker les fichiers texte de configuration en dehors du dossier accessible sur le Web.

Mais dans chaque dossier, je dois stocker d'autres fichiers, des images par exemple, qui doivent être accessibles sur le Web ... et je ne pense toujours pas que la réplication de la structure des dossiers, dans et hors du répertoire racine Web, soit également un moyen fiable. . Par conséquent, je devrai même changer la configuration d'apache pour inclure le dossier config dans le chemin php autorisé .. cela ne devrait pas être un problème, de toute façon.

Donc, si je n'ai pas le meilleur , je dois choisir le moins pire .

Je vais utiliser la solution des fichiers .htaccess multiples, pour l'instant, en espérant ne pas avoir de regrets à l'avenir.

Toute autre solution est appréciée.

Strae
la source
0

Dans la section Documentation de la commande :

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

Donc, ce qui suit est incorrect:

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

Ce qui suit est (plus) correct

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