1: Vérification du nombre de fichiers inclus
if( count(get_included_files()) == ((version_compare(PHP_VERSION, '5.0.0', '>='))?1:0) )
{
exit('Restricted Access');
}
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
// In the base page (directly accessed):
define('_DEFVAR', 1);
// In the include files (where direct access isn't permitted):
defined('_DEFVAR') or exit('Restricted Access');
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.
// Put the code in a separate file instead, say 'checkdefined.php':
defined('_DEFVAR') or exit('Restricted Access');
// Replace the same code in the include files with:
require_once('checkdefined.php');
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
// Call the include from the base page(directly accessed):
$includeData = file_get_contents("http://127.0.0.1/component.php?auth=token");
// In the include files (where direct access isn't permitted):
$src = $_SERVER['REMOTE_ADDR']; // Get the source address
$auth = authoriseIP($src); // Authorisation algorithm
if( !$auth ) exit('Restricted Access');
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:
if($key!="serv97602"){header("Location: ".$dart);exit();}
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.
//Your secure dir path based on server file-system
$secure_dir=dirname($_SERVER['DOCUMENT_ROOT']).DIRECTORY_SEPARATOR."secure".DIRECTORY_SEPARATOR;
include($secure_dir."securepage.php");
Logique:
- L'utilisateur ne peut demander aucun fichier en dehors du
htdocs
dossier car les liens seraient en dehors du champ d'application du système d'adresse du site Web.
- Le serveur php accède nativement au système de fichiers, et peut donc accéder aux fichiers sur un ordinateur, tout comme le peut un programme normal avec les privilèges requis.
- En plaçant les fichiers d'inclusion dans ce répertoire, vous pouvez vous assurer que le serveur php peut y accéder, tandis que le hotlinking est refusé à l'utilisateur.
- Même si la configuration d'accès au système de fichiers du serveur Web n'était pas effectuée correctement, cette méthode empêcherait ces fichiers de devenir publics accidentellement.
Veuillez excuser mes conventions de codage peu orthodoxes. Tout commentaire est apprécié.