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 sont dans le includes dossier.
  • 1 autre fichier (submit.php) se trouve dans le dossier racine pour l'action de soumission de formulaire.

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

117
demandé sur SomeKittens 2012-02-14 22:21:22

7 réponses

Je viens de passer à l' includes dossier de la web-racine, mais si vous voulez bloquer l'accès direct à l'ensemble includes dossier, vous pouvez mettre un .htaccess fichier 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 en php sans aucun problème.

245
répondu jeroen 2012-02-14 18:26:57

C'est une solution pure basée sur mod_rewrite:

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

Cela montrera l'erreur interdite à utiliser si L'URI contient /includes/ ou /submit.php

47
répondu anubhava 2013-12-01 19:23:18

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>
18
répondu spectre 2016-06-01 18:09:50

1 solution basée sur liner mod_alias:

RedirectMatch 403 ^/folder/file.php$

Cela montrera l'erreur interdite pour / folder / file.php

11
répondu starkeen 2016-01-11 16:32:02

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

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

8
répondu mainegreen 2012-02-14 18:27:29

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

Cependant, ce que je voulais discuter, 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 du tout? Je soupçonne que la réponse ici est que vous l'utilisez comme cible d'action sous certaines formes et seulement voulez qu'il soit déclenché lorsque le formulaire est soumis, et non pas directement , par exemple à partir d'un spammeur.

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 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 index PHP.le générateur de formulaire php inclut des champs cachés pour un horodatage et une validation. La validation peut être, par exemple, les 10 premiers caractères d'un MD5 de l'horodatage et que certains secrets. Lors du traitement de la soumission, vous pouvez alors (i) valider que l'horodatage et la validation correspondent, et (ii) l'horodatage est dans, disons, 15 minutes de l'heure actuelle.

Vous pouvez empêcher le spamming car le seul moyen pratique pour un spammeur d'obtenir une paire horodatage / validation valide serait d'analyser un formulaire, mais cette éraflure n'aurait qu'une durée de vie de 15 minutes.

8
répondu TerryE 2012-02-15 10:30:48

Selon d'autres options possibles définies à un niveau supérieur, vous devrez peut-être mettre ce qui suit dans votre .htaccess dans votre répertoire comprend:

Satisfy all
Order deny,allow
Deny from all

J'ai rencontré 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 tout prendre effet parce que les utilisateurs étaient authentifiés.

6
répondu Keith 2013-11-18 18:51:58