Dans PHP, la fonction PHP_UNAME () est utilisée pour obtenir des informations sur le système d'exploitation qui exécute les scripts PHP. Bien que cette fonction soit très utile dans le débogage et la gestion du système, il peut également devenir un risque potentiel de fuite d'informations. Un attaquant peut utiliser ces données pour mener d'autres attaques en obtenant des informations environnementales détaillées du serveur. Par conséquent, il est particulièrement important d'empêcher raisonnablement les risques de sécurité apportés par php_uname () .
Cet article commencera à partir des risques de php_uname () et expliquera des mesures de sécurité efficaces pour aider les développeurs à utiliser cette fonction en toute sécurité.
Le contenu renvoyé par php_uname () comprend généralement des informations telles que le nom du système d'exploitation, le nom d'hôte, la version, le numéro de version, etc. S'il est exposé aux utilisateurs non autorisés, ces informations peuvent:
Révéler les types de serveurs et les versions pour aider les attaquants à lancer des attaques contre des vulnérabilités système spécifiques.
Fournit des indices sur la structure du réseau pour faciliter la numérisation du réseau et l'intrusion.
Augmentez le risque de fuite d'informations sensibles et réduisez l'effet de protection de la sécurité du système.
Par exemple:
echo php_uname();
Cela peut sortir quelque chose comme les suivants:
Linux server1.m66.net 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64
À partir de cela, vous pouvez voir le type de système d'exploitation et la version du noyau, qui sont des informations extrêmement précieuses pour les attaquants.
Le moyen le plus simple de l'empêcher est d'éviter de sortir directement les résultats de PHP_UNAME () à la page frontale ou à la réponse API . Si vous devez vraiment obtenir des informations sur le serveur, vous devez vous assurer que les informations ne seront pas accessibles par les utilisateurs ordinaires.
Exemple:
// Démonstration d'erreur:Sortie directe,Fuite d'informations possibles
echo php_uname();
// Démonstration d'amélioration:Uniquement accessible aux administrateurs
session_start();
if (isset($_SESSION['is_admin']) && $_SESSION['is_admin'] === true) {
echo php_uname();
} else {
echo "Aucune autorisation pour accéder aux informations du système";
}
Combiné avec le mécanisme de vérification de l'autorisation de l'utilisateur, limitez strictement les rôles utilisateur qui peuvent appeler php_uname () et afficher sa sortie. Il est recommandé de définir l'interface ou la page pertinente pour accéder uniquement par les administrateurs.
Exemple de code:
function getServerInfo() {
// Autoriser l'accès à l'administrateur
session_start();
if (!isset($_SESSION['user_role']) || $_SESSION['user_role'] !== 'admin') {
http_response_code(403);
exit('Accès refusé');
}
return php_uname();
}
Si vous devez vraiment afficher certaines informations de serveur à l'utilisateur, il est recommandé de filtrer la sortie de php_uname () pour supprimer les champs sensibles, éviter la fuite de versions de noyau spécifiques, etc.
$fullInfo = php_uname();
$parts = explode(' ', $fullInfo);
// Seul le système d'exploitation et le nom d'hôte sont conservés,Bloquer la version du noyau et autres détails
$filteredInfo = $parts[0] . ' ' . $parts[1];
echo $filteredInfo;
Exemple de sortie:
Linux server1.m66.net
Dans les environnements de production avec des exigences de sécurité extrêmement élevées, les fonctions sensibles peuvent être désactivées via la configuration PHP.ini , y compris php_uname () :
disable_functions = php_uname
De cette façon, même s'il est appelé dans le code, la fonction ne sera pas exécutée, réduisant le risque de fuite. Cependant, il convient de noter que cela peut affecter la fonction normale des informations dépendantes du système.
Les journaux de surveillance et d'enregistrement de l'accès à des interfaces PHP_UNAME () aident à découvrir des comportements d'accès anormaux et à répondre aux menaces potentielles en temps opportun.
Exemple d'écriture de journal:
function logAccess($user) {
file_put_contents('/var/log/server_info_access.log', date('Y-m-d H:i:s') . " - {$user} accessed server info\n", FILE_APPEND);
}
session_start();
if (isset($_SESSION['user'])) {
logAccess($_SESSION['user']);
}
Mesures de sécurité | illustrer |
---|---|
Évitez la sortie directe | Ne pas afficher les résultats php_uname () sur des pages non autorisées |
Contrôle de l'autorisation | Restreindre uniquement les utilisateurs autorisés tels que les administrateurs à appeler et à accéder |
Filtrer les informations | Filtrez les informations de sortie pour supprimer les détails sensibles |
Désactiver les appels de fonction | Désactiver la fonction php_uname () via php.ini |
AUDIT DU JOG | Enregistrer les situations d'accès et prévenir l'accès anormal |
En concevant raisonnablement le contrôle du contrôle d'autorisation et de la sortie et en coopérant avec la surveillance du journal, les problèmes de fuite d'informations causés par PHP_UNAME () peuvent être effectivement évités et la sécurité des applications et serveurs PHP peut être assurée.
Si vous utilisez un environnement qui nécessite d'exposer les informations du serveur, assurez-vous d'abord de considérer les politiques de sécurité ci-dessus pour minimiser les risques potentiels.