Le site HTTP_HOST
est obtenu à partir de la En-tête de requête HTTP et c'est ce que le client a effectivement utilisé comme "hôte cible" de la demande. Le site SERVER_NAME
est défini dans la configuration du serveur. Le choix de l'une ou l'autre dépend de ce dont vous avez besoin. Vous devriez maintenant réaliser que l'une est une valeur contrôlée par le client qui peut donc ne pas être fiable pour une utilisation dans la logique métier et que l'autre est une valeur contrôlée par le serveur qui est plus fiable. Vous devez cependant vous assurer que le serveur web en question possède le code de sécurité SERVER_NAME
correctement configuré. Prenons l'exemple d'Apache HTTPD, dont voici un extrait sa documentation :
Si aucun nom de serveur n'est spécifié, le serveur tente de déduire le nom d'hôte en effectuant une recherche inverse sur l'adresse IP. Si aucun port n'est spécifié dans le ServerName, le serveur utilise le port de la requête entrante. Pour une fiabilité et une prévisibilité optimales, vous devez spécifier un nom d'hôte et un port explicites à l'aide de la directive ServerName.
Mise à jour : après avoir vérifié la réponse de Pekka à votre question qui contient un lien vers La réponse de Bobince que PHP retournerait toujours HTTP_HOST
de la valeur de SERVER_NAME
J'ai fait sauter la poussière de mon environnement XAMPP actuel sur Windows XP (Apache HTTPD 2.2.1 avec PHP 5.2.8), je l'ai démarré, j'ai créé une page PHP qui imprime les deux valeurs, j'ai créé une application de test Java en utilisant la fonction URLConnection
pour modifier le Host
L'en-tête et les tests m'ont appris que c'est effectivement (incorrectement) le cas.
Après avoir d'abord soupçonné PHP et creusé dans quelques Rapports de bogue PHP concernant le sujet, j'ai appris que la racine du problème se trouve dans le serveur web utilisé, qu'il renvoyait incorrectement HTTP Host
l'en-tête lorsque SERVER_NAME
a été demandé. Alors j'ai creusé dans Rapports de bogues sur Apache HTTPD en utilisant différents mots-clés sur le sujet, mais je n'arrive pas à en trouver une.
Ne sommes-nous pas censés remplir un rapport de bogue pour HTTPD à ce sujet ? Il semble que personne ne l'ait fait auparavant, bien que cela ait été suggéré plusieurs fois dans les rapports de bogue PHP correspondants.
Mise à jour 2 : Je pense de plus en plus que le problème se trouve en fait dans le phpX_module
spécifique pour Apache HTTPD sous Windows, car il semble fonctionner comme documenté lorsqu'il est utilisé sous Linux. Je ne sais seulement pas où trouver le site de développement, de documentation et de bogues pour les modules PHP libres ?
Mise à jour 3 : J'ai finalement trouvé un bug lié à la base de données des bugs d'Apache HTTPD. Ce comportement a été introduit aux alentours de la version 1.3 d'Apache HTTPD. Vous devez définir UseCanonicalName
à la directive on
dans le <VirtualHost>
entrée dans httpd.conf
(vérifiez également l'avertissement au bas de la page le document !).
<VirtualHost *>
ServerName example.com
UseCanonicalName on
</VirtualHost>
Cela a marché pour moi.
Résumée, SERVER_NAME
est plus fiable, mais vous dépendant sur la configuration du serveur !
15 votes
"J'opte normalement pour HTTP_HOST, afin que l'utilisateur reste sur le nom d'hôte exact sur lequel il a commencé. Par exemple, si j'ai le même site sur un domaine .com et .org, je ne veux pas envoyer quelqu'un de .org à .com, surtout s'il a des jetons de connexion sur .org qu'il perdrait s'il était envoyé sur l'autre domaine." - Ce point, ainsi que d'autres points intéressants, sont tirés de stackoverflow.com/questions/1459739/
6 votes
@Yarin, N'oubliez pas de vérifier sur une liste blanche les résultats de
HTTP_HOST
. Sinon, un attaquant peut mettre en tout dans l'interface HTTPHost:
et faire en sorte que le serveur l'accepte.7 votes
Débutants : Cette question fait référence aux valeurs généralement obtenues par
$_SERVER['HTTP_HOST']
o$_SERVER['SERVER_NAME']