Dans le développement de PHP, __halt_compiler () est une structure linguistique qui est moins mentionnée mais très utile dans certains scénarios. Il est utilisé pour dire à l'interprète PHP de "arrêter l'analyse ici", sautant ainsi tout ce qui suit dans le script. Ce mécanisme peut être utilisé pour masquer ou ajouter des données binaires ou de texte qui ne seront pas interprétées et exécutées, comme la création de scripts auto-extraits, d'outils d'emballage ou de formats de fichiers personnalisés. Cet article introduira en détail le rôle de __halt_compiler () et comment l'utiliser correctement pour éviter l'exécution de code non apparentée.
__halt_compiler () est une structure linguistique (pas une fonction) et lorsqu'il y est exécuté, l'interprète PHP cessera immédiatement de compiler tout le code suivant dans le fichier. Cela vous permet de stocker toutes les données non PHP à la fin d'un fichier PHP sans affecter l'exécution de code normale.
<?php
echo "Hello, World!";
__halt_compiler();
Ce ne sera pasPHPLe contenu de l'analyse。
Dans le code ci-dessus, seulement "bonjour, monde!" sera sorti et le texte après __halt_compiler () ne sera pas exécuté, analysé ou inclus dans la sortie.
Les développeurs peuvent utiliser __halt_compiler () pour créer des scripts ou des ressources intégrés auto-extraits. Par exemple, si vous souhaitez intégrer des fichiers de configuration, des données chiffrées, etc. À la fin du fichier PHP, vous pouvez le gérer comme ceci:
<?php
$dataOffset = __COMPILER_HALT_OFFSET__;
$data = file_get_contents(__FILE__, false, null, $dataOffset);
// Ici tu peux$dataFaire un traitement supplémentaire,Si non compression、Analyse, etc.
__halt_compiler();
// Les données binaires commencent
Dans certains scripts générés automatiquement, informations de débogage, chemins, jetons, etc., s'ils ne sont pas protégés avec __halt_compiler () , il peut être exécuté ou divulgué accidentellement.
Bien que __halt_compiler () lui-même puisse empêcher l'exécution du code ultérieur, nous devons également prêter attention aux points suivants:
Si un fichier contenant __halt_compiler () est référencé par d'autres fichiers via inclure ou exiger , PHP mettra fin à l'analyse du code restant lors de l'exécution de __halt_compiler () . Pour éviter cela, il est recommandé de définir le fichier en tant que fichier d'entrée autonome, ou d'ajouter des commentaires au rappel supérieur:
// N'incluez pas ce fichier,Devrait être accessible par opération autonome
Il est recommandé d'utiliser toujours la constante __compiler_halt_offset__ avec __file__ pour lire les données du suffixe pour éviter les décalages ou les chemins codés en dur. Par exemple:
$file = __FILE__;
$data = file_get_contents($file, false, null, __COMPILER_HALT_OFFSET__);
Cette méthode est plus robuste et plus propice au déploiement dans différents environnements.
Si vous enregistrez les données à l'arrière d'un fichier PHP, assurez-vous que le fichier n'est pas directement accessible au public par le serveur Web. Par exemple, vous pouvez utiliser des fichiers .htaccess pour restreindre l'accès:
<FilesMatch "secret\.php$">
Deny from all
</FilesMatch>
Alternativement, placez le fichier dans un répertoire non publique et contrôlez l'accès via le programme.
Voici un exemple simple montrant comment créer un script PHP auto-extrait contenant des données de configuration à l'aide de __halt_compiler () :
<?php
$configData = file_get_contents(__FILE__, false, null, __COMPILER_HALT_OFFSET__);
$config = unserialize($configData);
echo "Hôte de base de données: " . $config['db_host'];
__halt_compiler();
a:1:{s:7:"db_host";s:9:"gitbox.net";}
Dans le code ci-dessus, nous ajoutons la sérialisation de configuration à la fin du fichier PHP et obtenons les données de configuration par désérialisation d'exécution. C'est sûr et flexible.
Bien que __halt_compiler () ne soit pas une caractéristique fréquemment utilisée dans le développement quotidien, il est très puissant dans certains usages avancés, en particulier adaptés à des scénarios tels que la création de scripts emballés, intégrer des ressources et personnaliser le comportement d'exécution du PHP. La maîtrise de ses principes et leur utilisation peut non seulement améliorer la sécurité du code, mais également étendre les limites de l'utilisation de PHP.