183 votes

Empêcher l'accès direct à un fichier php include

J'ai un fichier php que j'utiliserai exclusivement comme un include. Par conséquent, j'aimerais déclencher une erreur au lieu de l'exécuter lorsque l'on y accède directement en tapant l'URL au lieu de l'inclure.

En gros, je dois faire une vérification comme suit dans le fichier php :

if ( $REQUEST_URL == $URL_OF_CURRENT_PAGE ) die ("Direct access not premitted");

Y a-t-il un moyen facile de le faire ?

13 votes

Au lieu de die(), vous devriez tester 'header("HTTP/1.1 404 File Not Found", 404) ; exit;'. Ceci (au moins sur Apache) fera en sorte que le serveur renvoie la page 404 normale.

1 votes

Voici deux méthodes simples que j'ai expliquées pour désactiver l'accès direct dans les fichiers inclus dans PHP -. codespeedy.com/disable-direct-access-to-the-php-include-file

219voto

UnkwnTech Points 21942

Ajoutez ceci à la page que vous voulez seulement inclure

<?php
if(!defined('MyConst')) {
   die('Direct access not permitted');
}
?>

puis sur les pages qui l'incluent, ajoutez

<?php
define('MyConst', TRUE);
?>

3 votes

Je dois vraiment apprendre à taper plus vite. C'est la même méthode que je suggérerais, car elle est plus sûre que celle qui utilise une variable pour vérifier. Avec certaines configurations PHP, il peut être possible de remplacer la variable.

3 votes

C'est ainsi que quelques applications "grand public" traitent cette question. Je sais que Joomla le fait de cette façon et je pense que Wiki, Wordpress et d'autres le font aussi.

1 votes

Si le message est trop utile pour un pirate (aucun utilisateur réel ne trouverait ces pages), vous pouvez simplement envoyer un en-tête de redirection et arrêter le traitement php.

187voto

Chuck Points 138930

La solution la plus simple pour la situation générique "application PHP fonctionnant sur un serveur Apache que vous pouvez ou non contrôler entièrement" est de placer vos includes dans un répertoire et de refuser l'accès à ce répertoire dans votre fichier .htaccess. Pour éviter aux gens d'avoir à chercher sur Google, si vous utilisez Apache, placez ce fichier dans un fichier appelé ".htaccess" dans le répertoire auquel vous ne voulez pas avoir accès :

Deny from all

Si vous avez le contrôle total du serveur (ce qui est plus courant de nos jours, même pour les petites applications, qu'à l'époque où j'ai écrit cette réponse), la meilleure approche consiste à placer les fichiers que vous voulez protéger en dehors du répertoire à partir duquel votre serveur web est servi. Donc si votre application est dans /srv/YourApp/ le serveur doit servir les fichiers à partir de /srv/YourApp/app/ et mettre les inclusions dans /srv/YourApp/includes donc il n'y a littéralement aucune URL qui peut y accéder.

1 votes

Merci, puisque j'ai un contrôle total sur le serveur où j'exécute cette application, c'est la réponse que j'ai choisie.

27 votes

Si vous avez le contrôle total du serveur, il est préférable de placer la configuration dans une directive de répertoire dans le fichier de configuration de l'hôte virtuel. Apache ne le lit qu'une fois au démarrage, .htaccess est lu à chaque accès et ralentit le serveur.

23 votes

Il serait bon d'avoir un exemple de fichier .htaccess dans le cadre de cette réponse.

123voto

null Points 3159

J'ai un fichier qui doit se comporter différemment selon qu'il est inclus ou qu'on y accède directement (principalement une print() vs return() ) Voici un code modifié :

if(count(get_included_files()) ==1) exit("Direct access not permitted.");

Le fichier auquel on accède est toujours un fichier inclus, d'où le == 1.

13 votes

C'est en fait une sacrée bonne idée de vérifier le nombre de fichiers inclus. Je me demande ce qui est le mieux : utiliser les définitions, ou utiliser cette méthode ? Cette dernière semble plus autonome.

0 votes

C'est la première fois que je vois quelqu'un inventer ça. Je ne sais pas pourquoi, parce qu'il semble aussi autonome que possible, et il mesure directement ce que vous voulez vraiment savoir (si est inclus ou non) plutôt que de mesurer quelque chose supposé être associé (comme une certaine constante ou un certain emplacement interdit par .htaccess). Magnifique.

0 votes

Celui-ci est vraiment cool parce que l'utilisation de .htaccess pour bloquer tous les fichiers .php peut ne pas être possible tout le temps car il peut y avoir certains fichiers dans le même répertoire qui ont besoin d'être appelés directement ou même par des javascripts. Merci pour cette idée géniale !

42voto

Eran Galperin Points 49594

La meilleure façon d'empêcher l'accès direct aux fichiers est de les placer en dehors du Root des documents du serveur web (généralement, un niveau au-dessus). Vous pouvez toujours les inclure, mais il n'y a aucune possibilité que quelqu'un y accède par une requête http.

J'ai l'habitude d'aller jusqu'au bout, et de placer tous mes fichiers PHP en dehors du document Root, à l'exception du fichier fichier d'amorçage - un seul index.php dans le Root du document qui commence à acheminer l'ensemble du site web/de l'application.

3 votes

C'est une excellente solution si vous êtes en mesure de le faire. Ce n'est que récemment que j'ai dû commencer à travailler avec des hébergeurs partagés et j'ai découvert que l'un des nombreux inconvénients était que tout doit être à l'intérieur du docroot.

3 votes

Chez tous les hébergeurs avec lesquels j'ai travaillé, j'ai toujours eu accès à (exactement) un niveau au-dessus du Root des documents.

3 votes

Chez certains hébergeurs (dont le mien), vous pouvez faire pointer votre domaine vers le dossier de votre choix.

31voto

Kevin Loney Points 3706

Une alternative (ou un complément) à la solution de Chuck serait de refuser l'accès aux fichiers correspondant à un modèle spécifique en plaçant quelque chose comme ceci dans votre fichier .htaccess

<FilesMatch "\.(inc)$">
    Order deny,allow
    Deny from all
</FilesMatch>

0 votes

Il serait préférable d'utiliser .inc.php, je crois, et c'est une pratique courante.

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