85 votes

Refuser l'accès direct à tous les fichiers .php sauf index.php

Je veux refuser l'accès direct à tous .php sauf un : index.php

Le seul accès à l'autre .php les fichiers devraient être par le biais de php include .

Si possible, je veux que tous les fichiers se trouvent dans le même dossier.

UPDATE :

Une règle générale serait la bienvenue, afin que je n'aie pas besoin de passer en revue tous les fichiers. Le risque est que j'oublie un fichier ou une ligne.

UPDATE 2 :

El index.php est dans un dossier www.myadress.com/myfolder/index.php

Je veux refuser l'accès à tous .php fichiers dans myfolder et des sous-dossiers dans ce dossier.

112voto

Residuum Points 6345

Tu es sûr que tu veux faire ça ? Même les fichiers css et js et les images et ... ?

OK, vérifiez d'abord si mod_access est installé sur apache, puis ajoutez ce qui suit à votre .htaccess :

Order Deny,Allow
Deny from all
Allow from 127.0.0.1

<Files /index.php>
    Order Allow,Deny
    Allow from all
</Files>

La première directive interdit l'accès à tous les fichiers sauf à partir de localhost, à cause de Order Deny,Allow Allow est appliquée plus tard, la seconde directive n'affecte que le fichier index.php.

Attention : pas d'espace après la virgule dans la ligne d'ordre.

[EDIT :]

Pour autoriser l'accès aux fichiers correspondant à *.css ou *.js, utilisez cette directive :

<FilesMatch ".*\.(css|js)$">
    Order Allow,Deny
    Allow from all
</FilesMatch>

Vous ne pouvez pas utiliser de directives pour <Location> o <Directory> dans les fichiers .htaccess, cependant.

Votre option serait d'utiliser <FilesMatch ".*\.php$"> autour du premier groupe allow,deny et ensuite autoriser explicitement l'accès à index.php.

91voto

Jerska Points 3280

En fait, je suis venu ici avec la même question que le créateur du sujet, mais aucune des solutions données n'était une réponse complète à mon problème. Pourquoi ajouter un code à TOUS les fichiers de votre serveur quand vous pouvez simplement le configurer une fois ? La solution la plus proche était celle de Residuum, mais il excluait quand même TOUS les fichiers, alors que je voulais exclure uniquement les fichiers php qui ne s'appelaient pas index.php.

J'ai donc créé un fichier .htaccess contenant ceci :

<Files *.php>
    Order Deny,Allow
    Deny from all
    Allow from 127.0.0.1
</Files>

<Files index.php>
    Order Allow,Deny
    Allow from all
</Files>

(N'oubliez pas que les fichiers htaccess fonctionnent de manière récursive, ce qui correspond parfaitement à la condition préalable de la question).

Et voilà. Les seuls fichiers php qui seront accessibles pour un utilisateur seront ceux nommés index.php. Mais vous pourrez toujours accéder à chaque image, feuille de style css, js script, etc.

35voto

user185631 Points 450

Une réponse indirecte à cette question consiste à écrire tout le code sous forme de classes, à l'exception des fichiers index.php, qui sont alors les seuls points d'entrée. Les fichiers PHP qui contiennent des classes ne provoqueront rien, même s'ils sont invoqués directement par Apache.

Une réponse directe est d'inclure ce qui suit dans le fichier .htaccess :

<FilesMatch "\.php$">
    Order Allow,Deny
    Deny from all
</FilesMatch>
<FilesMatch "index[0-9]?\.php$">
    Order Allow,Deny
    Allow from all
</FilesMatch>

Cela permettra d'accéder à n'importe quel fichier comme index.php, index2.php etc., mais refusera tout accès aux autres fichiers .php. Cela n'affectera pas les autres types de fichiers.

17voto

n1313 Points 5853

Vous pouvez essayer de définir une constante dans index.php et ajoutez quelque chose comme

if (!defined("YOUR_CONSTANT")) die('No direct access');

au début des autres fichiers.

OU, vous pouvez utiliser mod_rewrite et rediriger les requêtes vers index.php, en éditant .htaccess comme ça :

RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /index.php/$1 [L,R=301]

Vous devriez alors être en mesure d'analyser toutes les requêtes entrantes dans le fichier index.php et de prendre les mesures nécessaires.

Si vous voulez exclure tous les fichiers *.jpg, *.gif, *.css et *.png, par exemple, vous devez modifier la deuxième ligne comme suit :

RewriteCond $1 !^(index\.php|*\.jpg|*\.gif|*\.css|*\.png)

11voto

nikc.org Points 7275

Et si vous gardiez tous les fichiers .php, à l'exception de index.php, au-dessus du site web Root ? Pas besoin de règles de réécriture ou de manipulations programmatiques.

L'ajout du dossier "includes" à votre chemin d'inclusion vous aidera à garder les choses simples, sans avoir besoin d'utiliser des chemins absolus, etc.

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