Voici le scénario:
index.php
dans le dossier racineindex.php
qui se trouvent dans le dossier includes
.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).
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.
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
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>
1 solution basée sur mod_alias doublure:
RedirectMatch 403 ^/folder/file.php$
Cela affichera une erreur interdite pour /folder/file.php
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.
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.
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.
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.