Remarque : Pour suivre cet article, nous supposons que vous possédez des connaissances de base en programmation en PHP.
Cet article traite d'un extrait de code PHP que vous avez probablement vu en haut de votre CMS ou framework préféré. Vous avez probablement lu que vous devez toujours l'inclure au début de chaque fichier PHP que vous développez, pour des raisons de sécurité, mais sans explication très claire de pourquoi. Je fais référence à ce code :
?php if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly } Ce type de code est très courant dans les fichiers WordPress, bien qu’il apparaisse dans presque tous les frameworks et CMS. Dans le cas du CMS Joomla, par exemple, le seul changement est qu'au lieu deABSPATH, il utiliseJEXEC. A part ça, la logique reste la même. Ce CMS a évolué à partir d'un système précédent appelé Mambo, qui utilisait également un code similaire, mais avec_VALID_MOScomme constante. Si l’on remonte encore plus loin, on constate que le premier CMS à utiliser ce type de code était PHP-Nuke (considéré par certains comme le premier CMS basé sur PHP).
Le flux d'exécution de PHP-Nuke (et de la plupart des CMS et frameworks actuels) consistait à charger séquentiellement plusieurs fichiers pour répondre à l'action effectuée par l'utilisateur ou le visiteur sur le site Web. Par exemple, imaginez un site Web de cette époque hébergé sur example.net avec ce CMS installé. Chaque fois que la page d'accueil était chargée, le système exécutait une séquence de fichiers dans l'ordre (ce n'est qu'un exemple, pas une séquence réelle) :index.php => load_modules.php => modules.php. Dans cette chaîne,index.phpa été chargé en premier, qui a ensuite chargéload_modules.php, qui à son tour a chargémodules.php.
Cette chaîne d'exécution ne commençait pas toujours par le premier fichier (index.php). En fait, n'importe qui pourrait contourner une partie du flux en accédant directement à l'un des autres fichiers PHP via son URL (par exemple,http://example.net/load_modules.phpouhttp://example.net/modules.php), ce qui, comme nous le verrons, pourrait s’avérer risqué dans de nombreux cas.
Comment ce problème a-t-il été résolu ? Une mesure de sécurité a été introduite, ajoutant un code similaire à celui-ci au début de chaque fichier :
?php if (!eregi("modules.php", $HTTP_SERVER_VARS['PHP_SELF'])) { die ("You can't access this file directly..."); } Essentiellement, ce code, placé en haut d'un fichier nommémodules.php, vérifié simodules.phpét...
[Courte citation de 8% de l'article original]