138 votes

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

Voici le scénario :

  • Hay un index.php dans le dossier racine
  • certains fichiers sont inclus dans index.php qui se trouvent dans le includes dossier.
  • 1 autre fichier ( submit.php ) se trouve dans le dossier racine de l'action de soumission du formulaire.

Je veux restreindre l'accès direct des utilisateurs aux fichiers de la base de données. includes par htaccess. également pour submit.php . Mais inclure travaillera pour index.php fichier. Par exemple, si l'utilisateur tape www.domain.com/includes/somepage.php il le limitera (il peut être redirigé vers une page d'erreur).

280voto

jeroen Points 47068

Je voudrais juste déplacer le includes hors de l'arborescence web, mais si vous voulez bloquer l'accès direct à l'ensemble du dossier includes vous pouvez mettre un .htaccess dans ce dossier qui 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.

7 votes

Est-ce que d'autres fichiers pourront faire une requête ajax vers le fichier présent dans ce dossier ?

16 votes

@ChaitanyaChandurkar Non, une requête ajax est une requête http normale, elle sera donc refusée.

0 votes

Sr b/c je nouvelle programmation web. Comment puis-je ajouter une exception pour l'accès à mon fichier index.php ?

59voto

anubhava Points 172509

C'est du pur mod_rewrite solution basée sur la technologie :

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

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

3 votes

Bon travail en ce qui concerne le dossier de soumission

10voto

mainegreen Points 132

Si je comprends bien, vous voulez simplement interdire l'accès au dossier "includes" ?

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

8voto

TerryE Points 5660

Votre question se divise en deux parties, les solutions de jeroen et d'anubhava fonctionnent pour la partie I -- refuser l'accès à /includes. Celle d'anubhava fonctionne également pour la partie II. Je préfère la dernière solution parce que j'utilise un DOCROOT/.htaccess de toute façon et cela permet de garder tous ces contrôles dans un seul fichier.

Cependant, ce dont je voulais discuter, c'est du concept de "refus d'accès à l'information". submit.php ". Si vous ne voulez pas utiliser submit.php alors pourquoi l'avoir dans DOCROOT ? Je soupçonne que la réponse est que vous l'utilisez comme cible d'action dans certains formulaires et que vous voulez qu'il soit activé uniquement lorsque le formulaire est soumis et non directement, par exemple par un spambot.

Si c'est le cas, vous ne pouvez pas utiliser la partie II d'Anubhava, car votre formulaire échouera. Ce que vous pouvez faire ici, c'est (i) avec l'option .htaccess pour s'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 l'envoi, vous pouvez alors (i) vérifier que l'horodatage et la validation correspondent, et (ii) que l'horodatage se situe dans une fourchette de 15 minutes par rapport à l'heure actuelle.

Cela permet d'éviter le spamming, car le seul moyen pratique pour un spammer d'obtenir un couple valide d'horodatage et de validation serait d'analyser un formulaire, mais ce scrape n'aurait qu'une durée de vie de 15 minutes.

7voto

Keith Points 476

En fonction des éventuelles autres options définies à un niveau supérieur, vous devrez peut-être ajouter les éléments suivants dans votre fichier .htaccess situé 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 a défini l'authentification de base en incluant la ligne :

Satisfy any

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X