J'ai un fichier php que j'utiliserai aussi exclusivement en tant qu'inclusion. Par conséquent, je voudrais lancer une erreur au lieu de l'exécuter lorsqu'elle est accessible directement en tapant l'URL au lieu d'être incluse.
Fondamentalement, 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 faire ceci?
php
include
include-guards
Alterlife
la source
la source
Réponses:
Le moyen le plus simple pour la situation générique «application PHP exécutée sur un serveur Apache que vous pouvez ou non contrôler complètement» est de placer vos inclusions dans un répertoire et de refuser l'accès à ce répertoire dans votre fichier .htaccess. Si vous utilisez Apache, placez-le dans un fichier appelé ".htaccess" dans le répertoire auquel vous ne voulez pas accéder:
Si vous avez réellement le contrôle total du serveur (plus courant de nos jours, même pour les petites applications que lorsque j'ai écrit cette réponse pour la première fois), la meilleure approche consiste à coller les fichiers que vous souhaitez protéger en dehors du répertoire à partir duquel votre serveur Web sert. . Donc, si votre application est dans
/srv/YourApp/
, définissez le serveur à partir duquel les fichiers sont diffusés/srv/YourApp/app/
et insérez les inclusions/srv/YourApp/includes
, de sorte qu'aucune URL ne puisse y accéder.la source
<Files ~ "\.inc$">
Order Allow,Deny
Deny from All
</Files>
Ajoutez ceci à la page que vous souhaitez uniquement inclure
puis sur les pages qui l'incluent, ajoutez
la source
somefile.php
sur votre serveur et y ont ajouté votre définition, cela ne leur permet toujours pas d'accéder directement au fichier d'inclusion. Cela leur permettra "d'inclure" vos fichiers de bibliothèque, mais s'ils vont assez loin pour créer des fichiers sur votre serveur et connaître vos scripts de définition / inclusion, vous rencontrez d'autres problèmes qui empêchent probablement d'écrire leur propre fichier avec votre définition en premier lieu .J'ai un fichier dont j'ai besoin pour agir différemment lorsqu'il est inclus et lorsqu'il est accédé directement (principalement un
print()
vsreturn()
) Voici un code modifié:Le fichier en cours d'accès est toujours un fichier inclus, d'où le == 1.
la source
La meilleure façon d'empêcher l'accès direct aux fichiers est de les placer en dehors de la racine du document 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 via une requête http.
Je vais généralement jusqu'au bout et je place tous mes fichiers PHP en dehors de la racine du document à part le fichier d'amorçage - un index.php isolé dans la racine du document qui commence à acheminer l'ensemble du site Web / de l'application.
la source
1: Vérification du nombre de fichiers inclus
Logique: PHP se ferme si le nombre minimum d'inclusions n'est pas atteint. Notez qu'avant PHP5, la page de base n'est pas considérée comme une inclusion.
2: Définition et vérification d'une constante globale
Logique: Si la constante n'est pas définie, alors l'exécution n'a pas commencé à partir de la page de base et PHP arrêterait de s'exécuter.
Notez que pour des raisons de portabilité à travers les mises à niveau et les modifications futures, rendre cette méthode d'authentification modulaire réduirait considérablement la surcharge de codage car les modifications n'auront pas besoin d'être codées en dur dans chaque fichier.
De cette façon, du code supplémentaire peut être ajouté à des
checkdefined.php
fins de journalisation et d'analyse, ainsi que pour générer des réponses appropriées.Le crédit là où le crédit est dû: l' idée géniale de la portabilité est venue de cette réponse .
3: autorisation d'adresse à distance
L'inconvénient de cette méthode est une exécution isolée, sauf si un jeton de session est fourni avec la requête interne. Vérifiez via l'adresse de bouclage dans le cas d'une configuration de serveur unique, ou une liste blanche d'adresses pour une infrastructure de serveur multi-serveur ou à charge équilibrée.
4: autorisation de jeton
Similaire à la méthode précédente, on peut utiliser GET ou POST pour passer un jeton d'autorisation au fichier d'inclusion:
Une méthode très compliquée, mais peut-être aussi la plus sûre et la plus polyvalente à la fois, lorsqu'elle est utilisée de la bonne manière.
5: configuration spécifique au serveur Web
La plupart des serveurs vous permettent d'attribuer des autorisations pour des fichiers ou des répertoires individuels. Vous pouvez placer toutes vos inclusions dans de tels répertoires restreints et configurer le serveur pour les refuser.
Par exemple dans APACHE, la configuration est stockée dans le
.htaccess
fichier. Tutoriel ici .Notez cependant que les configurations spécifiques au serveur ne sont pas recommandées par moi car elles sont mauvaises pour la portabilité entre différents serveurs Web. Dans des cas comme les systèmes de gestion de contenu où l'algorithme de refus est complexe ou la liste des répertoires refusés est assez volumineuse, cela ne peut que rendre les sessions de reconfiguration plutôt horribles. En fin de compte, il est préférable de gérer cela dans le code.
6: Placement inclut dans un répertoire sécurisé EN DEHORS de la racine du site
Moins préféré en raison des limitations d'accès dans les environnements de serveur, mais une méthode plutôt puissante si vous avez accès au système de fichiers.
Logique:
htdocs
dossier car les liens seraient en dehors du champ d'application du système d'adresse du site Web.Veuillez excuser mes conventions de codage peu orthodoxes. Tout commentaire est apprécié.
la source
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 mettant quelque chose comme ça dans votre fichier .htaccess
la source
En fait, mon conseil est de faire toutes ces meilleures pratiques.
De cette façon, si les fichiers sont égarés d'une manière ou d'une autre (une opération ftp erronée), ils sont toujours protégés.
la source
J'ai eu ce problème une fois, résolu avec:
mais la solution idéale est de placer le fichier en dehors de la racine du document du serveur Web, comme mentionné dans une autre réponse.
la source
Vous feriez mieux de créer une application avec un point d'entrée, c'est-à-dire que tous les fichiers doivent être atteints à partir de index.php
Placez ceci dans index.php
Cette vérification doit s'exécuter dans chaque fichier lié (via require ou include)
la source
Je voulais restreindre l'accès au fichier PHP directement, mais aussi pouvoir l'appeler via
jQuery $.ajax (XMLHttpRequest)
. Voici ce qui a fonctionné pour moi.la source
Le moyen le plus simple est de définir une variable dans le fichier qui appelle include, telle que
Ensuite, dans le fichier qui est inclus, vérifiez la variable
la source
Outre la manière .htaccess, j'ai vu un motif utile dans divers frameworks, par exemple en ruby on rails. Ils ont un répertoire pub / séparé dans le répertoire racine de l'application et les répertoires de la bibliothèque vivent dans des répertoires au même niveau que pub /. Quelque chose comme ça (pas idéal, mais vous voyez l'idée):
Vous configurez votre serveur Web pour utiliser pub / comme racine de document. Cela offre une meilleure protection à vos scripts: alors qu'ils peuvent accéder à partir de la racine du document pour charger les composants nécessaires, il est impossible d'accéder aux composants depuis Internet. Un autre avantage en plus de la sécurité est que tout est au même endroit.
Cette configuration est meilleure que la simple création de vérifications dans chaque fichier inclus, car le message "accès non autorisé" est un indice pour les attaquants, et il est meilleur que la configuration .htaccess car il n'est pas basé sur une liste blanche: si vous bousillez les extensions de fichier il ne sera pas visible dans les répertoires lib /, conf / etc.
la source
Qu'est-ce que Joomla! fait est de définir une constante dans un fichier racine et de vérifier si elle est définie dans les fichiers inclus.
ou sinon
on peut garder tous les fichiers hors de portée d'une requête http en les plaçant en dehors du répertoire webroot comme le recommandent la plupart des frameworks comme CodeIgniter.
ou même en plaçant un fichier .htaccess dans le dossier d'inclusion et en écrivant des règles, vous pouvez empêcher l'accès direct.
la source
la source
Ma réponse est quelque peu différente dans son approche, mais comprend bon nombre des réponses fournies ici. Je recommanderais une approche à plusieurs volets:
defined('_SOMECONSTANT') or die('Hackers! Be gone!');
TOUTEFOIS, l'
defined or die
approche présente un certain nombre d'échecs. Tout d'abord, c'est une vraie douleur dans les hypothèses à tester et déboguer. Deuxièmement, cela implique une refactorisation terriblement et ennuyeuse si vous changez d'avis. "Trouver et remplacer!" vous dites. Oui, mais êtes-vous sûr que c'est écrit exactement de la même façon partout, hmmm? Maintenant, multipliez cela avec des milliers de fichiers ... oOEt puis il y a .htaccess. Que se passe-t-il si votre code est distribué sur des sites où l'administrateur n'est pas si scrupuleux? Si vous ne comptez que sur .htaccess pour sécuriser vos fichiers, vous aurez également besoin a) d'une sauvegarde, b) d'une boîte de mouchoirs pour sécher vos larmes, c) d'un extincteur pour éteindre les flammes dans tous les courriers électroniques des personnes en utilisant votre code.
Je sais donc que la question demande le "plus simple", mais je pense que ce que cela demande, c'est plus de "codage défensif".
Ce que je suggère est:
require('ifyoulieyougonnadie.php');
( pasinclude()
et en remplacement dedefined or die
)Dans
ifyoulieyougonnadie.php
, faites des choses logiques - vérifiez les différentes constantes, appelez le script, testez l'hôte local et autres - puis implémentez votredie(), throw new Exception, 403
, etc.Je crée mon propre framework avec deux points d'entrée possibles - le principal index.php (framework Joomla) et ajaxrouter.php (mon framework) - donc en fonction du point d'entrée, je vérifie des choses différentes. Si la demande
ifyoulieyougonnadie.php
ne provient pas de l'un de ces deux fichiers, je sais que des manigances sont en cours!Mais que faire si j'ajoute un nouveau point d'entrée? Pas de soucis. Je change juste
ifyoulieyougonnadie.php
et je suis trié, plus pas de «recherche et remplacement». Hourra!Et si je décidais de déplacer certains de mes scripts pour faire un framework différent qui n'a pas les mêmes constantes
defined()
? ... Hourra! ^ _ ^J'ai trouvé que cette stratégie rend le développement beaucoup plus amusant et beaucoup moins:
la source
Si plus précisément, vous devez utiliser cette condition:
get_included_files () retourne un tableau indexé contenant les noms de tous les fichiers inclus (si le fichier est exécuté, il a été inclus et son nom est dans le tableau). Ainsi, lorsque le fichier est directement accédé, son nom est le premier du tableau, tous les autres fichiers du tableau ont été inclus.
la source
placez le code ci-dessus en haut de votre fichier php inclus.
ex:
la source
Le code suivant est utilisé dans le CMS Flatnux ( http://flatnux.altervista.org ):
la source
J'ai trouvé cette solution uniquement php et invariable qui fonctionne à la fois avec http et cli:
Définissez une fonction:
Appelez la fonction du fichier à laquelle vous souhaitez empêcher l'accès direct:
La plupart des solutions données ci-dessus à cette question ne fonctionnent pas en mode Cli.
la source
la source
la source
Le stockage de vos fichiers d'inclusion en dehors du répertoire accessible sur le Web a été mentionné à plusieurs reprises et constitue certainement une bonne stratégie lorsque cela est possible. Cependant, une autre option que je n'ai pas encore vue mentionnée: assurez-vous que vos fichiers d'inclusion ne contiennent aucun code exécutable . Si vos fichiers d'inclusion définissent simplement des fonctions et des classes, et n'ont pas de code autre que cela, ils produiront simplement une page vierge lorsqu'ils seront accédés directement.
Autorisez par tous les moyens un accès direct à ce fichier depuis le navigateur: cela ne fera rien . Il définit certaines fonctions, mais aucune d'elles n'est appelée, donc aucune d'elles ne s'exécute.
La même chose s'applique aux fichiers qui ne contiennent que des classes PHP, et rien d'autre.
C'est toujours une bonne idée de conserver vos fichiers en dehors du répertoire Web lorsque cela est possible.
system
, car cela entrerait en conflit avec un chemin utilisé pour le code. Je trouve cela ennuyeux.la source
Faites quelque chose comme:
la source
Vous pouvez utiliser la méthode suivante ci-dessous bien qu'elle présente un défaut, car elle peut être truquée, sauf si vous pouvez ajouter une autre ligne de code pour vous assurer que la requête provient uniquement de votre serveur soit en utilisant Javascript. Vous pouvez placer ce code dans la section Corps de votre code HTML pour que l'erreur s'affiche.
Placez votre autre code HTML ici
Terminez-le comme ceci, de sorte que la sortie de l'erreur s'affichera toujours dans la section body, si c'est comme ça que vous voulez qu'elle soit.
la source
Je suggère de ne pas utiliser
$_SERVER
pour des raisons de sécurité.Vous pouvez utiliser une variable comme
$root=true;
dans le premier fichier qui en comprenait un autre.et utiliser
isset($root)
au début du deuxième fichier à inclure.la source
Ce que vous pouvez également faire, c'est protéger le répertoire par mot de passe et y conserver tous vos scripts php, bien sûr à l'exception du fichier index.php, car au moment de l'inclusion, le mot de passe ne sera pas requis car il ne sera requis que pour l'accès http. ce qu'il fera est également de vous fournir la possibilité d'accéder à vos scripts au cas où vous le voudriez car vous aurez un mot de passe pour accéder à ce répertoire. vous devrez configurer le fichier .htaccess pour le répertoire et un fichier .htpasswd pour authentifier l'utilisateur.
eh bien, vous pouvez également utiliser l'une des solutions fournies ci-dessus au cas où vous estimeriez ne pas avoir besoin d'accéder à ces fichiers normalement car vous pouvez toujours y accéder via cPanel, etc.
J'espère que cela t'aides
la source
Le moyen le plus simple est de stocker vos inclusions en dehors du répertoire Web. De cette façon, le serveur y a accès mais pas de machine extérieure. Le seul inconvénient est que vous devez pouvoir accéder à cette partie de votre serveur. L'avantage est qu'il ne nécessite aucune installation, configuration ou stress supplémentaire sur le code / serveur.
la source
Je n'ai pas trouvé les suggestions avec .htaccess si bonnes car elles peuvent bloquer d'autres contenus de ce dossier auxquels vous voudrez peut-être autoriser l'utilisateur à accéder, voici ma solution:
la source
fera le travail en douceur
la source
BASEPATH
const
est défini dans unindex.php
fichier qui se trouve au bas de l'arborescence. CI réécrit les URL afin qu'il n'y ait pas besoin d'accéder aux scripts directement de toute façon.Solution mentionnée précédemment avec vérification de la version PHP ajoutée:
la source