Éviter l'accès direct à php include de fichier
J'ai un fichier php qui je vais être en utilisant exclusivement comme un include. Par conséquent, je tiens à jeter une erreur au lieu de l'exécuter quand il est directement accessible en tapant l'URL au lieu d'être inclus.
Essentiellement, j'ai besoin de faire une vérification de la façon suivante dans le fichier php:
if ( $REQUEST_URL == $URL_OF_CURRENT_PAGE ) die ("Direct access not premitted");
Est-il un moyen facile de faire cela?
- au lieu de le die (), vous devez tester 'header("HTTP/1.1 404 Fichier Non Trouvé", 404); exit;'. Ce sera (au moins sur apache) que le serveur retourne à la normale de la page 404.
- Voici deux méthodes faciles que j'ai expliquer pour désactiver l'accès direct en PHP, les fichiers inclus: codespeedy.com/disable-direct-access-to-the-php-include-file
Vous devez vous connecter pour publier un commentaire.
Le moyen le plus facile pour le générique "PHP app en cours d'exécution sur un serveur Apache qui vous peut ou ne peut pas contrôler totalement la situation est à mettre votre inclut dans un répertoire et de refuser l'accès à ce répertoire dans votre .fichier htaccess. Pour sauver les gens de la difficulté de Googler, si vous utilisez Apache, le mettre dans un fichier appelé ".htaccess" dans le répertoire que vous ne voulez pas être accessibles:
Si vous avez le plein contrôle du serveur (en plus fréquent de nos jours, même pour de petites applications que quand j'ai écrit cette réponse), la meilleure approche consiste à coller les fichiers que vous souhaitez protéger à l'extérieur du répertoire de votre serveur web est le service. Donc, si votre application est en cours d'
/srv/YourApp/
, configurez le serveur pour servir des fichiers à partir de/srv/YourApp/app/
et de mettre l'inclut dans/srv/YourApp/includes
, donc il y a, littéralement, n'est pas une URL qui peuvent y accéder.<Files ~ "\.inc$">
Order Allow,Deny
Deny from All
</Files>
AllowOverride All
dans les configs Apache, et c'est de loin pas par défaut sur tous les principaux OS configurations.Deny from all
il n'a même pas de travailler dans un include, il sera 404.L'ajouter à la page que vous souhaitez seulement être inclus
alors sur les pages que l'inclure ajouter
somefile.php
sur votre serveur et ajouté vos définir en elle, ce n'est pas pour les laisser accéder directement au fichier include. Il leur permettra de "comprendre" votre bibliothèque de fichiers, mais si elles obtiennent assez loin pour être la création de fichiers sur votre serveur et connaître vos définir/inclure des scripts, vous avez d'autres questions susceptibles de nier l'écriture de leur propre fichier de votre de définir en premier lieu.defined('MyConst') || die('Direct access not permitted');
J'ai un fichier que j'ai besoin d'agir différemment lorsqu'il est inclus vs quand il est directement accessible (principalement un
print()
vsreturn()
) Voici quelques code modifié:Le fichier en cours d'accès est toujours un fichier inclus, d'où l' == 1.
if( count(get_included_files()) == ((version_compare(PHP_VERSION, '5.0.0', '>='))?1:0) ) exit("Direct access not permitted.");
La meilleure façon de prévenir l'accès direct aux fichiers est de les placer à l'extérieur de la web-serveur racine du document (généralement, un niveau au-dessus). Vous pouvez toujours inclure, mais il n'y a pas de possibilité de quelqu'un d'accéder par le biais d'une requête http.
J'ai l'habitude d'aller tout le chemin, et de placer l'ensemble de mes fichiers PHP en dehors de la racine du document en dehors de la fichier de bootstrap - un seul index.php dans la racine du document qui commence le routage de l'ensemble du site web/de l'application.
Une alternative (ou un complément) de Chuck solution serait de refuser l'accès à des fichiers correspondant à un modèle spécifique par mettre quelque chose comme ceci dans votre .fichier htaccess
1: Vérifier le nombre de fichiers inclus
Logique: PHP quitte si le minimum inclure le comte n'est pas remplie. Noter que, avant PHP5, la page de base n'est pas considéré comme un include.
2: Définir et vérifier une constante globale
Logique: Si la constante n'est pas définie, l'exécution n'a pas commencé à partir de la page de base, et PHP allait s'arrêter.
3: Distance de l'adresse de l'autorisation
L'inconvénient de cette méthode est isolé à l'exécution, à moins qu'une session-jeton fourni avec la demande interne. Vérifier par l'intermédiaire de la boucle de retour de l'adresse dans le cas d'un seul serveur configuration, ou une adresse de liste blanche pour un multi-serveur ou à charge équilibrée de l'infrastructure serveur.
4: Jeton d'autorisation
Similaire à la méthode précédente, on peut utiliser GET ou POST pour passer un jeton d'autorisation pour le fichier include:
Une très salissant méthode, mais peut-être aussi le plus sûr et le plus polyvalent dans le même temps, lorsqu'il est utilisé dans le droit chemin.
5: Serveur de configuration spécifiques
La plupart des serveurs vous permettent d'attribuer des autorisations pour les fichiers ou les répertoires. Vous pourrez y mettre tous vos inclut dans les répertoires, et que le serveur soit configuré pour les refuser.
Par exemple dans APACHE, la configuration est stockée dans la
.htaccess
fichier. Tutoriel ici.Note cependant que serveur de configurations spécifiques ne sont pas recommandés par moi parce qu'ils sont mauvais pour la portabilité sur différents serveurs web. Dans de tels cas, où le nier-l'algorithme est complexe ou la liste de refus d'annuaires est plutôt grand, il peut seulement faire la reconfiguration des sessions plutôt macabre. En fin de compte, il est préférable de gérer dans le code.
6: Placer les inclut dans un répertoire sécurisé à l'EXTÉRIEUR de la racine du site
Moins privilégiées en raison de restrictions d'accès dans les environnements de serveurs, mais plutôt une méthode puissante si vous avez accès au système de fichiers.
Logique:
htdocs
dossier que les liens seront en dehors de la portée de l'adresse du site web du système.S'il vous plaît excusez mon peu orthodoxe des conventions de codage. Tout commentaire est apprécié.
En fait, mon conseil est de faire tous ces meilleures pratiques.
ET
De cette façon, si les fichiers sont égarés en quelque sorte (un errant opération ftp), ils sont encore protégés.
J'ai eu ce problème une fois, résolu avec:
mais l'idéal est de placer le fichier à l'extérieur de la web-serveur racine du document, tel que mentionné dans une autre réponse.
Vous feriez mieux de construire des applications avec un seul point d'entrée, c'est à dire tous les fichiers doivent être atteint à partir de index.php
De le placer dans index.php
Cette case doit s'exécuter dans chaque fichier lié (via nécessitent ou include)
La façon la plus simple est de mettre une variable dans le fichier qui comprennent des appels, comme
Puis dans le fichier qui est inclus, vérifiez la variable
Ce Que Joomla! ne est la définition d'une Constante dans un fichier racine et de vérifier si le même est défini dans les fichiers inclus.
ou d'autre
on peut garder tous les fichiers en dehors de la portée d'une requête http en les plaçant à l'extérieur du répertoire webroot comme la plupart des frameworks comme CodeIgniter recommander.
ou même en plaçant un .fichier htaccess dans le dossier inclure et les règles d'écriture, vous pouvez empêcher l'accès direct.
Je voulais restreindre l'accès à la PHP fichier directement, mais aussi être capable de l'appeler par l'intermédiaire
jQuery $.ajax (XMLHttpRequest)
. Voici ce qui a fonctionné pour moi.Outre le .htaccess passant, j'ai vu un pattern très utile dans différents cadres, par exemple en ruby on rails. Ils ont un pub/répertoire dans le répertoire racine de l'application et de la bibliothèque sont les répertoires qui vivent dans les annuaires de la même niveau comme pub/. Quelque chose comme ceci (pas l'idéal, mais vous voyez l'idée):
De configurer votre serveur web pour utiliser pub/comme racine du document. Cela offre une meilleure protection à vos scripts: alors qu'ils peuvent atteindre à partir de la racine du document à charger les composants nécessaires, il est impossible d'accéder aux composants de l'internet. Un autre avantage en plus de la sécurité, c'est que tout est dans un seul endroit.
Cette configuration est mieux que de créer des contrôles dans chaque fichier inclus parce que "accès non autorisé" message est un indice pour les attaquants, et c'est mieux qu' .htaccess configuration car il n'est pas blanc-liste: si vous bousiller les extensions de fichier, il ne sera pas visible dans la lib/conf/etc. les répertoires.
Si plus précisément, vous devez utiliser cette condition:
get_included_files() retourne tableau indexé contenant les noms de tous les fichiers inclus (si le fichier est beign exécuté alors qu'il a été inclus et son nom est dans le tableau).
Ainsi, lorsque le fichier est directement accessible, son nom est le premier dans le tableau, tous les autres fichiers dans le tableau ont été inclus.
placez le code ci-dessus dans le haut de votre inclus fichier php.
ex:
Le code suivant est utilisé dans le Flatnux CMS (http://flatnux.altervista.org):
J'ai trouvé ce php-seulement et invariable solution qui fonctionne à la fois avec le protocole http et de la cli :
Définir une fonction :
Appel de la fonction dans le fichier que vous souhaitez éviter l'accès direct à :
La plupart des solutions données ci-dessus à cette question ne fonctionnent pas en mode Cli.
Ma réponse est un peu différent, mais dans l'approche inclut un grand nombre de réponses fournies ici. Je recommande une approche à volets multiples:
defined('_SOMECONSTANT') or die('Hackers! Be gone!');
CEPENDANT la
defined or die
approche présente un certain nombre de manquements. Tout d'abord, c'est une vraie douleur dans les hypothèses à tester et déboguer avec. Deuxièmement, elle implique horriblement, l'état d'esprit numbingly ennuyeux refactoring si vous changez d'avis. "Rechercher et remplacer!" dites-vous. Oui, mais comment êtes-vous sûr qu'il est écrit exactement la même chose partout, hmmm? Maintenant, multipliez ce avec des milliers de fichiers... o.OEt puis il y a des .htaccess. Qu'advient-il si votre code est distribué sur les sites où l'administrateur n'est pas si scrupuleux? Si vous comptez uniquement sur .htaccess pour sécuriser vos fichiers, vous allez aussi avoir besoin d'un) une copie de sauvegarde, b) une boîte de mouchoirs pour sécher vos larmes, c) un extincteur pour éteindre les flammes dans tous les hatemail de personnes à l'aide de votre code.
Donc je sais que la question demande le plus "facile", mais je pense que cela demande est plus sur la défensive "codage".
Ce que je suggère est:
require('ifyoulieyougonnadie.php');
(pasinclude()
et comme un remplacement pourdefined or die
)Dans
ifyoulieyougonnadie.php
, faire un peu de logique trucs - vérifier les différentes constantes, l'appel de script, localhost test et de tel - puis de mettre en œuvre votredie(), throw new Exception, 403
, etc.Je suis entrain de créer ma propre structure avec deux points d'entrée principale index.php (Joomla), et un cadre ajaxrouter.php (mon cadre) - donc en fonction du point d'entrée, je check pour des choses différentes. Si la demande de
ifyoulieyougonnadie.php
ne vient pas de l'un de ces deux fichiers, je sais manigances sont en train d'être réalisée!Mais ce que si j'ajoute un nouveau point d'entrée? Pas de soucis. Je viens de changer
ifyoulieyougonnadie.php
et je suis triés, plus aucun "rechercher et remplacer". Hourra!Ce que si j'ai décidé de passer certains de mes scripts pour faire un cadre différent qui n'a pas les mêmes constantes
defined()
? ... Hourra! ^_^J'ai trouvé cette stratégie de développement beaucoup plus agréable et beaucoup moins:
Faire quelque chose comme:
Vous pouvez utiliser la méthode ci-dessous, bien que, il a un défaut, car il peut être faux, sauf si vous pouvez ajouter une autre ligne de code assurez-vous que la demande ne vient que de votre serveur à l'aide de Javascript.
Vous pouvez placer ce code dans la section de Corps de votre code HTML, donc l'erreur de shows.
Placez votre autre code HTML ici
Fin comme cela, de sorte que la sortie de l'erreur sera toujours montrer dans la section de corps, si c'est la façon dont vous voulez qu'il soit.
je suggère de ne pas utiliser de
$_SERVER
pour des raisons de sécurité .Vous pouvez utiliser une variable comme
$root=true;
en premier fichier inclus un autre.et l'utilisation
isset($root)
en début de deuxième fichier à inclure.Ce que vous pouvez également faire est de protéger le mot de passe du répertoire et de garder tous vos scripts php de là, bien sûr, à l'exception de la index.php fichier, comme à l'époque d'inclure le mot de passe n'est pas nécessaire, car il sera requis uniquement pour l'accès http. ce qu'il va faire est de vous offrons également la possibilité d'accéder à vos scripts dans le cas où vous voulez tant que vous aurez le mot de passe pour accéder à ce répertoire. vous aurez besoin pour l'installation .fichier htaccess du répertoire et une .un fichier htpasswd pour authentifier l'utilisateur.
bien, vous pouvez également utiliser l'une des solutions ci-dessus dans le cas où vous sentez que vous n'avez pas besoin d'accéder à ces fichiers, normalement, parce que vous pouvez toujours y accéder via cPanel etc.
Espère que cette aide
La façon la plus simple est de stocker vos comprend en dehors de la racine web. De cette façon, le serveur a accès à eux mais pas à l'extérieur de la machine. Le seul inconvénient est que vous devez être en mesure d'accéder à cette partie de votre serveur. L'avantage est qu'il ne nécessite aucune installation, configuration, ou un code supplémentaire/serveur de stress.
Je n'ai pas trouvé les suggestions avec .htaccess si bon, car il peut bloquer
d'autres contenus dans ce dossier lesquelles vous pouvez autoriser l'utilisateur à accéder à,
c'est ma solution:
le travail se fera en douceur
BASEPATH
const
est situé dans unindex.php
fichier qui jette au bas de la structure de l'arbre. CI réécrit l'Url, donc il n'est pas nécessaire pour accéder aux scripts directement, de toute façon.Vous pouvez utiliser phpMyAdmin Style:
c'est ce que google utilise dans leur php exemples voir ici
Le stockage de vos fichiers d'en-dehors de l'accessibles sur le web directory a été mentionné à quelques reprises, et est certainement une bonne stratégie lorsque cela est possible. Cependant, une autre option que je n'ai pas encore vu mentionné: s'assurer que vos fichiers d'en - ne contiennent pas de code exécutable. Si vos fichiers ne font que définir des fonctions et des classes, et n'ont pas de code autre que cela, ils vont tout simplement à produire une page blanche quand on y accède directement.
Par tous les moyens de permettre un accès direct à ce fichier depuis le navigateur: il ne fera rien. Elle définit des fonctions, mais aucun d'entre eux sont appelés, de sorte qu'aucun d'entre eux exécutés.
La même chose s'applique pour les fichiers qui ne contiennent que des classes PHP, et rien d'autre.
C'est toujours une bonne idée de garder vos fichiers en dehors du répertoire web si possible.
system
, parce que ce serait en conflit avec un chemin d'accès utilisé pour le code. Je trouve cela ennuyeux.Mentionné plus tôt, la solution avec la version de PHP vérifier ajouté:
De redirection à partir de ce fichier vers une autre page. (comme index.html)
.htaccess:
Vous pouvez également essayer de renommer le document que vous ne voulez pas les gens à être en mesure d'accéder. Vous pouvez la renommer 47d8498d3w.php par exemple. Faites juste quelque chose que la plupart des gens ne sera probablement pas le type de comme http-request. Si vous incluez le fichier avec SSI ou PHP, l'utilisateur ne sera pas en mesure de voir le nom du document, de toute façon.