web-dev-qa-db-fra.com

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

Voici le scénario:

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

Je veux restreindre l'accès direct des utilisateurs aux fichiers du dossier includes par htaccess. aussi pour submit.php. Mais include fonctionnera pour le fichier index.php. Par exemple, si l'utilisateur tape www.domain.com/includes/somepage.php, il sera restreint (peut être redirigé vers une page d'erreur).

125
Imrul.H

Je voudrais simplement déplacer le dossier includes hors de la racine Web, mais si vous souhaitez bloquer l’accès direct à tout le dossier includes, vous pouvez placer un fichier .htaccess dans ce dossier. contient juste:

deny from all

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

257
jeroen

C'est une solution pure mod_rewrite:

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

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

53
anubhava

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>
23
luke1985

1 solution basée sur mod_alias doublure:

RedirectMatch 403 ^/folder/file.php$

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

13
starkeen

Si je comprends bien, vous voulez simplement refuser l’accès au dossier includes?

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

9
mainegreen

Votre Q se décline en deux parties. Les solutions de jeroen et d’anubhava fonctionnent pour la partie I: refuser l’accès à/includes. Anubhava travaille également pour la partie II. Je préfère ce dernier parce que j'utilise de toute façon un DOCROOT/.htaccess et que cela conserve tout le contrôle dans un seul fichier.

Cependant, ce que je voulais évoquer, c’est le concept de "refuser l’accès à submit.php". Si vous ne voulez pas utiliser submit.php alors pourquoi l'avoir dans DOCROOT? Je suppose que la réponse à cette question est que vous l'utilisez comme cible d'action dans certains formulaires et que vous ne souhaitez le renvoyer que lorsque le formulaire est soumis, et non directement, par exemple. d'un spambot.

Si cela est vrai, vous ne pouvez pas utiliser la partie II d’anubhava car cela entraînerait l’échec de votre formulaire. Ce que vous pouvez faire ici est (i) avec la vérification .htaccess 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 PHP index.php, indiquez 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 l'envoi, vous pouvez ensuite (i) valider que l'horodatage et la validation correspondent, et (ii) l'horodatage se situe dans les 15 minutes de l'heure actuelle, par exemple.

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

8
TerryE

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

Satisfy all
Order deny,allow
Deny from all

J'ai rencontré ce problème lorsque le répertoire supérieur définissait l'authentification de base, y compris la ligne:

Satisfy any

Cela empêchait mon refus de tout prendre effet parce que les utilisateurs étaient authentifiés.

6
Keith

Vous pouvez ajouter la commande ci-dessous au fichier .htaccess

Deny from all
ErrorDocument 403 "nothing is here"

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

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

ErrorDocument 404 "/errors/404.html"

Il sera redirigé vers le /errors/404.html et affichera la page personnalisée non trouvée.

0
user1324491