Interdire l'acces à un répertoire mais l'autoriser via php

Nouveau WRInaute
Bonjour,

Tout d'abord, pour mon premier message je voulais dire que ce site est très intéressant! Merci à tous ;-)

Je me pose une question et j'ai pas trouvé la réponse:
Je veux protéger un répertoire. En gros si avec un navigateur on tape:
http://monsite.com/rep ou http://monsite.com/rep/3.gif alors je veux que le navigateur ne liste pas le répertoire ou n'affiche pas l'image.

Par contre je veux pouvoir accéder avec un fichier php (automatiquement sans que l'utilisateur doivent s'authentifier) au contenu de ce répertoire.

J'ai essayé avec un .htaccess et .password mais cela ne marche que si à travers le navigateur je me suis authentifié avant...

Avez-vous SVP des idées??

Help,
Franck
 
WRInaute impliqué
salut,

pour le "non listage", il suffit de mettre un fichier index.html ou index.php dedans :wink:
pour le reste, je ne vois pas trop et je passe la main..
 
WRInaute discret
Salut,
Si j’ai bien compris tu veux interdire accès à ton répertoire via le http, dans ce cas la tu peux interdire le listage de répertoire en mettant ce code htaccess dans le répertoire concerné

Code:
#--------------------------------------------------
# Interdiction de listage de repertoire
#--------------------------------------------------

Options -Indexes

EDIT : en plus du code htaccess il faut créer un fichier index.html et le mettre dans le répertoire concerné avec le code ci-dessous
Code:
<script>history.go(-1);</script>
 
WRInaute discret
honolulu a dit:
salut,

pour le "non listage", il suffit de mettre un fichier index.html ou index.php dedans :wink:
pour le reste, je ne vois pas trop et je passe la main..

Un fichier index c’est bien aussi, mais pas très efficace contre les aspirateurs de site
 
WRInaute accro
Re: Interdire l'acces à un répertoire mais l'autoriser via p

fweens a dit:
Je me pose une question et j'ai pas trouvé la réponse:
Je veux protéger un répertoire. En gros si avec un navigateur on tape:
http://monsite.com/rep ou http://monsite.com/rep/3.gif alors je veux que le navigateur ne liste pas le répertoire ou n'affiche pas l'image.

Par contre je veux pouvoir accéder avec un fichier php (automatiquement sans que l'utilisateur doivent s'authentifier) au contenu de ce répertoire.

J'ai essayé avec un .htaccess et .password mais cela ne marche que si à travers le navigateur je me suis authentifié avant...

Tu mets dans le directory un fichier .htaccess avec dedans "Deny from all". Et voilà, plus personne ne peut accéder à ce répertoire (et aux fichiers qu'il contient) par une requête http classique. Mais ton code PHP peut continuer à accéder aux fichiers.

Note que c'est bien le code PHP qui doit accéder au fichier (et ensuite envoyer le contenu au navigateur), tu ne peux pas afficher un lien vers une image qui serait dans ce dossier, par exemple, puisque c'est interdit.

Jacques.
 
Nouveau WRInaute
Re: Interdire l'acces à un répertoire mais l'autoriser via p

jcaron a dit:
Tu mets dans le directory un fichier .htaccess avec dedans "Deny from all". Et voilà, plus personne ne peut accéder à ce répertoire (et aux fichiers qu'il contient) par une requête http classique. Mais ton code PHP peut continuer à accéder aux fichiers.

Note que c'est bien le code PHP qui doit accéder au fichier (et ensuite envoyer le contenu au navigateur), tu ne peux pas afficher un lien vers une image qui serait dans ce dossier, par exemple, puisque c'est interdit.

Jacques.
Hello Jacques,

Aussi simple que cela?? Si cela fonctionne c'est cool!

Oui c'est bien ce que je veux faire... Le PHP retournera l'image que si la personne a le "droit" !

Merci,
Franck
 
WRInaute accro
Pour interdire l'acces à un répertoire mais l'autoriser via php, l'astuce est simple.

Dans l'exemple, le code recupere tous les fichiers avec une extention .gif et redirige vers /foo, cad nul part.

Si nous aviosn mis -www.monsite.com/img.gif dans le navigateur, nous serions redirigé vers /foo, qui bien sur n'existe pas.

Par contre si dans le code source nous faisons par exsmple un print d'une image<img="www.monsite.com/img.gif ">, nous verrons l'image puisque le .htaccess n'intervient pas.

Code:
Options +FollowSymlinks 
RewriteEngine On 
#Empêche l'execution de ces types de fichiers depuis l'exterieur 
#Renvoie une erreur 404 si de tels fichiers sont demandés 
RewriteRule ^.*\.gif$ /foo [F] 
RewriteRule ^.*\.GIF$ /foo [F] 
RewriteRule ^.*\.Gif$ /foo [F] 
RewriteRule ^.*\.GiF$ /foo [F]
 
Nouveau WRInaute
Merci mais cela veut dire que si quelqu'un créé une page et met dedans:<img="www.monsite.com/img.gif ">, cela va marcher? Dans ce cas c'est pas ce que je veux...

Franck
KOogar a dit:
Pour interdire l'acces à un répertoire mais l'autoriser via php, l'astuce est simple.

Dans l'exemple, le code recupere tous les fichiers avec une extention .gif et redirige vers /foo, cad nul part.

Si nous aviosn mis -www.monsite.com/img.gif dans le navigateur, nous serions redirigé vers /foo, qui bien sur n'existe pas.

Par contre si dans le code source nous faisons par exsmple un print d'une image<img="www.monsite.com/img.gif ">, nous verrons l'image puisque le .htaccess n'intervient pas.

Code:
Options +FollowSymlinks 
RewriteEngine On 
#Empêche l'execution de ces types de fichiers depuis l'exterieur 
#Renvoie une erreur 404 si de tels fichiers sont demandés 
RewriteRule ^.*\.gif$ /foo [F] 
RewriteRule ^.*\.GIF$ /foo [F] 
RewriteRule ^.*\.Gif$ /foo [F] 
RewriteRule ^.*\.GiF$ /foo [F]
 
WRInaute accro
fweens a dit:
Merci mais cela veut dire que si quelqu'un créé une page et met dedans:<img="www.monsite.com/img.gif ">, cela va marcher? Dans ce cas c'est pas ce que je veux...


Ce quelqu'un a acces au ftp de ton site pour y mettre ses pages !!???
 
WRInaute accro
KOogar a dit:
Pour interdire l'acces à un répertoire mais l'autoriser via php, l'astuce est simple.

Dans l'exemple, le code recupere tous les fichiers avec une extention .gif et redirige vers /foo, cad nul part.

Plus précisément, le flag F dit qu'il va renvoyer un 403 (Forbidden). Le /foo est juste là parce que RewriteRule a besoin d'un paramètre de "destination", même si dans le cas présent il n'en a pas vraiment besoin.

KOogar a dit:
Si nous aviosn mis -www.monsite.com/img.gif dans le navigateur, nous serions redirigé vers /foo, qui bien sur n'existe pas.

Par contre si dans le code source nous faisons par exsmple un print d'une image<img="www.monsite.com/img.gif ">, nous verrons l'image puisque le .htaccess n'intervient pas.

Ah oui? Il va falloir m'expliquer la différence entre taper l'URL dans la barre d'adresse d'un navigateur et suivre un lien dans une page vers la même URL. A part le referer (qui n'est pas une information fiable), il n'y a strictement aucune différence, donc dans un cas comme dans l'autre, ça ne marchera pas, les RewriteRules proposées étant fonctionnellement identiques à un Deny from all dans des FilesMatch avec les mêmes regex.

Pas de miracle de toutes façons, il n'y a aucun moyen qui marche à tous les coups de gérer les deux cas de façon indépendante (sans passer par un script qui utilisera une information externe, comme un authentification, cookie, un paramètre dynamique dans une URL...).

KOogar a dit:
Code:
Options +FollowSymlinks 
RewriteEngine On 
#Empêche l'execution de ces types de fichiers depuis l'exterieur 
#Renvoie une erreur 404 si de tels fichiers sont demandés 
RewriteRule ^.*\.gif$ /foo [F] 
RewriteRule ^.*\.GIF$ /foo [F] 
RewriteRule ^.*\.Gif$ /foo [F] 
RewriteRule ^.*\.GiF$ /foo [F]

C'est visiblement une obsession par ici d'utiliser mod_rewrite à tout va. Si on veut interdire l'accès à tous les fichiers avec une extension .gif (ce qui n'est pas la question d'origine), un simple:
Code:
<FilesMatch "\.[gG][iI][fF]$">
Deny from all
</FilesMatch>

devrait faire l'affaire (ça permet d'éviter de charger mod_rewrite juste pour ça, par exemple). Quoi qu'il arrive une regex qui commence par "^.*" c'est quand même un peu du gâchis. Donc au minimum j'ai tendance à penser (je n'utilise jamais mod_rewrite) que les règles ci-dessus peuvent s'écrire de façon nettement plus concise:

Code:
RewriteEngine On 
#Empêche ces types de fichiers d'être servis
#Renvoie une erreur 403 si de tels fichiers sont demandés 
RewriteRule \.gif$ /foo [F,NC]

Avec un commentaire nettement plus exact en prime :)

Jacques.
 
WRInaute accro
yep, au placard KOogar!!

on cherche a solutionner ?

Code:
Options +FollowSymlinks 
RewriteEngine On 
#Empêche ces types de fichiers d'être servis 
#Renvoie une erreur 403 si de tels fichiers sont demandés 
#Autorise l'acces par fichier php si le REFERER est correctement renvoyé par le serveur

RewriteCond %{HTTP_REFERER} !^http://www\.domaine\.com [NC]
RewriteRule ^.*\.gif$ /foo [F]

J'ai testé et ca marche tres bien :wink: (chose bien sur que je n'avais pas fait avec l'autre code, oups)

Bien sur tu va nous commenter ca bien mieux que moi et peut etre trouver un paliatif au rewrite qui est trop lourd. Je suis sincerement enchanté par ton intervention. On a avancé :D
 
WRInaute accro
KOogar a dit:
Code:
#Autorise l'acces par fichier php si le REFERER est correctement renvoyé par le serveur

J'ai testé et ca marche tres bien :wink: (chose bien sur que je n'avais pas fait avec l'autre code, oups)

Bien sur tu va nous commenter ca bien mieux que moi et peut etre trouver un paliatif au rewrite qui est trop lourd. Je suis sincerement enchanté par ton intervention. On a avancé :D

Comme déjà dit, le Referer c'est sympa, mais c'est loin d'être fiable. Il y a des cas où le referer n'est pas fourni:
- certains softs de "sécurité" ou de "protection de la vie privée" genre firewalls, anti-virus etc. le suppriment ou le remplacent;
- certains types de "liens" ne positionnent pas le referer dans IE.

Ca veut dire que dans ce cas l'utilisateur ne pourra pas voir le fichier même s'il est intégré tout à fait normalement.

Avec ton code se pose en plus le problème du site accessible via plusieurs noms de domaine (par exemple site.com et -www.site.com). Si on relâche trop, c'est facile à contourner (par exemple en mettant le nom du site dans le chemin de la page qui référence), si on "resserre" trop on va toujours oublier un cas de figure où ça devrait marcher.

Bref, c'est loin d'être la solution magique, et d'ailleurs je pense que le posteur original l'avait bien compris, c'est pour ça qu'il voulait que ses fichiers ne soient pas accessibles du tout comme des fichiers statiques via Apache, mais uniquement à travers son PHP (qui va faire un open sur le fichier et le balancer à l'utilisateur dans certaines conditions particulières bien vérifiées). D'ailleurs il y a encore plus simple que toutes les solutions évoquées jusqu'ici pour arriver à ça: mettre les fichier en dehors de l'arbo de fichiers Apache! Evidemment dans certains hébergements mutualisés ça risque de ne pas être possible, mais sinon c'est quand même la solution la plus simple.

Quant aux tests effectués dans le script qui va "servir" les images, suivant ce qu'on cherche exactement à faire ça peut être très variable. Si on veut juste empêcher n'importe qui ne linker depuis l'extérieur une bonne solution est probablement d'inclure dans l'URL un timestamp et un md5 de ce timestamp + une clef privée, et de vérifier que le md5 correspond et que le timestamp n'est pas trop vieux au moment de servir. Sinon il peut aussi y avoir des solutions à base de cookies, mais ici comme pour les referers c'est un peu sujet à leur acceptation par le navigateur (même si de nos jours je pense que peu de gens se promènent avec des cookies désactivés, il y a tellement peu de choses qui marchent sans...).

Jacques.
 
WRInaute accro
wouuu, résolu pour moi, puisque coté client je peux pas l'apeler, je vais le faire coté serveur, je m'explique :

je fait 1 .htaccess qui interdit, allez soyons royal !! de prendre toutes les images.

Code:
RewriteEngine on 
ReWriteRule .*\.(gif|png|jpe?g)$ - [F]

Je me fais maintenant un ptit fichier avec mon image que j'apel par exmple comme le nom de l'image :

Code:
cherche.php :

<?php 
readfile("cherche.gif");
?>

Et j'ai plus qu'a apeler mon fichier :

Code:
<img src="cherche.php"  />


Ca tourne nickel :D

T'en pense quoi ?
 
Nouveau WRInaute
Merci Jacques et à tous pour toutes ces précisions.

Désolé du retard mais finalement j'ai testé, cela fait ce que je veux. Voici donc le résultat:

Options -indexes
Options +FollowSymlinks
RewriteEngine On
<FilesMatch "\.[jJ][pP][gG]$">
Deny from all
</FilesMatch>

F.
 
Discussions similaires
Haut