Dans PHP, get_defined_constants () est une fonction qui obtient toutes les constantes définies (y compris les constantes définies par l'utilisateur et le système PHP) et leurs valeurs correspondantes. Cette fonction est très utile lors du débogage, de la vérification de la configuration ou du développement d'outils de débogage, mais s'il est utilisé mal, il peut également provoquer des risques de sécurité, en particulier dans les scénarios impliquant des informations sensibles.
get_defined_constants ([bool $ categorize = false]): array
Cette fonction renvoie toutes les constantes définies dans le script actuel. Lorsque le paramètre $ catégorisé est défini sur true , le tableau retourné sera classé par module pour faciliter l'identification de la source de diverses constantes.
Par exemple:
$constants = get_defined_constants();
print_r($constants);
Ce code produit toutes les constantes définies et leurs valeurs, y compris des constantes telles que E_Error , PHP_Version et les constantes définies par l'utilisateur via Define () ou Const .
Bien que la plupart des constantes prédéfinies par le système soient inoffensives, les constantes définies par l'utilisateur peuvent contenir des informations sensibles, telles que les informations d'identification de base de données, les clés d'API, les informations sur le chemin, etc. par exemple:
define('DB_PASSWORD', 'SuperSecretPassword123');
define('API_KEY', 'sk_live_abc123xyz789');
Si le résultat de retour de get_defined_constants () est directement sorti dans l'outil de débogage ou le système de journalisation et les exposer aux utilisateurs externes, des informations sensibles peuvent être divulguées. Ceci est particulièrement dangereux lors du déploiement d'environnements en ligne dans des environnements multi-utilisateurs ou des outils de débogage.
En particulier dans certaines pages de débogage ou systèmes de traitement des erreurs, les développeurs peuvent habituellement produire des États mondiaux pour analyser des problèmes, tels que:
echo '<pre>';
print_r(get_defined_constants());
echo '</pre>';
Si une telle sortie n'est pas limitée par les autorisations, un attaquant peut accéder à la page pour obtenir un contenu constant contenant des données sensibles.
Supposons qu'un outil de débogage PHP (comme un moniteur d'erreur personnalisé) soit déployé sur https://debug.m66.net/debug.php et contient le code suivant:
if ($_GET['debug'] === '1') {
echo '<pre>';
print_r(get_defined_constants());
echo '</pre>';
}
Une fois le commutateur de débogage activé, la page publiera toutes les informations constantes. Si certaines constantes contiennent ce qui suit:
define('PAYMENT_GATEWAY_SECRET', 'sk_test_abc123');
define('AWS_SECRET_ACCESS_KEY', 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY');
Les attaquants peuvent facilement lire ces informations, provoquant de graves conséquences sur la sécurité.
Pour éviter la fuite d'informations sensibles, il est recommandé de suivre les meilleures pratiques suivantes lors de l'utilisation de get_defined_constants () :
Évitez la sortie de toutes les constantes dans les environnements de production . Utilisez cette fonction uniquement dans des environnements de développement locaux ou de confiance.
Gestion de la classification des informations sensibles . Placez la configuration sensible dans un fichier de configuration séparé et assurez-vous que le fichier n'est pas défini comme une constante, mais est stocké en mémoire comme variable.
Contrôle d'accès . Toutes les interfaces contenant des informations de débogage doivent être authentifiées et l'accès public est interdit.
Sortie du filtre conditionnel . Vérifiez le nom constant avant la sortie, par exemple, à l'exclusion des constantes contenant des mots clés sensibles tels que le secret , la clé , le mot de passe , etc.:
$constants = get_defined_constants();
foreach ($constants as $name => $value) {
if (preg_match('/(SECRET|KEY|PASSWORD)/i', $name)) {
continue;
}
echo "$name => $value\n";
}
Désensibilisation du log . Si des informations constantes sont écrites dans le système de journal, assurez-vous d'effectuer une désensibilisation avant la rédaction.
get_defined_constants () est une fonction puissante, mais "plus la capacité est grande, plus la responsabilité" est grande ". Les développeurs doivent pleinement considérer les risques de sécurité potentiels lors de l'utilisation, en particulier dans des contextes impliquant des informations sensibles. Grâce à un bon contrôle d'accès, au filtrage de sortie et à l'isolement environnemental, les risques provoqués en utilisant cette fonction peuvent être réduits efficacement et la sécurité globale de l'application peut être assurée.