refuser l'accès direct à un dossier et un fichier par htaccess

134

Voici le scénario:

  • Il y a un index.phpfichier dans le dossier racine
  • certains fichiers sont inclus dans index.phplesquels se trouvent dans le includesdossier.
  • 1 autre fichier ( submit.php) se trouve dans le dossier racine pour l'action d'envoi de formulaire.

Je souhaite restreindre l'accès utilisateur direct aux fichiers du includesdossier par htaccess. aussi pour submit.php. Mais inclure fonctionnera pour le index.phpfichier. Comme, si l'utilisateur tape www.domain.com/includes/somepage.php, il le restreindra (peut être redirigé vers une page d'erreur).

Imrul.H
la source

Réponses:

266

Je voudrais simplement déplacer le includesdossier hors de la racine Web, mais si vous souhaitez bloquer l'accès direct à l'ensemble du includesdossier, vous pouvez placer un .htaccessfichier dans ce dossier qui contient juste:

deny from all

De cette façon, vous ne pouvez ouvrir aucun fichier à partir de ce dossier, mais vous pouvez les inclure dans php sans aucun problème.

jeroen
la source
7
Un autre fichier pourra-t-il faire une requête ajax au fichier présent dans ce dossier?
Chaitanya Chandurkar
16
@ChaitanyaChandurkar Non, une requête ajax est une requête http normale, elle sera donc refusée.
jeroen
Sr b / c I nouvelle programmation web. Comment puis-je ajouter une exception pour accéder à mon fichier index.php?
PhatHV
J'ai utilisé deny from all et il a restreint toutes les URL .. ne montrant même pas la page de connexion .. :(
Aamir
@Aamir C'est correct, aucune URL de ce dossier ne sera accessible mais vous pouvez les inclure dans d'autres fichiers sans aucun problème.
jeroen
56

C'est une mod_rewritesolution basée pure :

RewriteRule ^(includes/|submit\.php) - [F,L,NC]

Cela affichera une erreur interdite à utiliser si l'URI contient soit /includes/ou/submit.php

anubhava
la source
3
Bon travail pour traiter le fichier de soumission
CTS_AE
29

Il est possible d'utiliser une directive Files et d'interdire l'accès à tous les fichiers, puis de l'utiliser à nouveau pour définir les fichiers accessibles:

<Files ~ "^.*">
  Deny from all
</Files>

<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
  Allow from all
</Files>
luke1985
la source
7
Je ne suis pas sûr de celui qui a posé la question de savoir si son problème a été résolu ou non, mais c'est la beauté de SO que la réponse multiple peut aider de nombreux membres. Cette dernière réponse a résolu mon problème. Je veux laisser les sites obtenir le fichier css mais pas d'accès aux polices ttf ou otf, et boum! résolu.
Moxet Khan
après cela, je ne suis pas autorisé à accéder aux fichiers dans les sous
Gintare Statkute
14

1 solution basée sur mod_alias de doublure:

RedirectMatch 403 ^/folder/file.php$

Cela affichera une erreur interdite pour /folder/file.php

Amit Verma
la source
1
+1 - C'est en fait très bien, car personne ne peut même voir quels fichiers existent si vous appliquez 404 à un dossier entier, en utilisant regex ^folder.
bytecode77
9

Si je comprends bien, vous souhaitez simplement refuser l'accès au dossier inclus?

Un .htaccess avec une directive «DENY FROM ALL» placée dans le dossier includes ferait l'affaire.

vert maine
la source
8

Votre Q se compose de deux parties, les solutions de jeroen et anubhava fonctionnent pour la partie I - refuser l'accès à / comprend. anubhava fonctionne également pour la partie II. Je préfère ce dernier parce que j'utilise un de DOCROOT/.htaccesstoute façon et cela garde tout ce contrôle dans un seul fichier.

Cependant, ce que je voulais discuter est le concept de "refuser l'accès à submit.php". Si vous ne voulez pas l'utiliser, submit.phppourquoi l'avoir dans DOCROOT? Je soupçonne que la réponse ici est que vous l'utilisez comme cible d'action dans certaines formes et que vous ne voulez qu'il soit déclenché lorsque le formulaire est soumis et non directement, par exemple à partir d'un spambot.

Si cela est vrai, vous ne pouvez pas utiliser la partie II d'anubhava car cela entraînera l'échec de votre formulaire. Ce que vous pouvez faire ici est (i) avec le .htaccesschèque pour vous assurer que le référent était votre propre page d'index:

RewriteCond %{HTTP_REFERRER} !=HTTP://www.domain.com/index.php   [NC]
RewriteRule ^submit\.php$    -                                   [F]

Et (ii) dans votre générateur de formulaire PHP index.php, incluez des champs cachés pour un horodatage et une validation. La validation pourrait être, par exemple, les 10 premiers caractères d'un MD5 de l'horodatage et un secret interne. Lors du traitement de la soumission, vous pouvez alors (i) valider que l'horodatage et la validation correspondent, et (ii) l'horodatage se situe à moins de, par exemple, 15 minutes de l'heure actuelle.

Cela vous permet d'éviter le spam, car le seul moyen pratique pour un spammeur d'obtenir une paire horodatage / validation valide serait d'analyser un formulaire, mais cette gratte n'aurait qu'une durée de vie de 15 minutes.

TerryE
la source
6

En fonction des autres options possibles définies à un niveau supérieur, vous devrez peut-être mettre les éléments suivants dans votre fichier .htaccess dans votre répertoire includes:

Satisfy all
Order deny,allow
Deny from all

Je suis tombé sur ceci lorsque le répertoire supérieur a défini l'authentification de base, y compris la ligne:

Satisfy any

Cela empêchait mon refus de tous de prendre effet car les utilisateurs étaient authentifiés.

Keith
la source
1

Vous pouvez ajouter la commande ci-dessous au .htaccessfichier

Deny from all
ErrorDocument 403 "nothing is here"

Il affichera le message "rien n'est ici" en cas d'accès non autorisé.

Si vous souhaitez rediriger par un code d'erreur vers une certaine page, vous pouvez définir une commande comme suit:

ErrorDocument 404 "/errors/404.html"

Il redirigera vers /errors/404.htmlet affichera la page personnalisée introuvable.

user1324491
la source