Le seul moyen sûr de le faire
Toutes les autres réponses de cette page ont des implications en matière de sécurité dont vous devez être conscient.
La seule méthode sécurisée garantie pour récupérer le domaine actuel
est de 𝓼𝓽𝓸𝓻𝓮 𝓲𝓽 𝓲𝓷 𝓪 𝓼𝓮𝓬𝓾𝓻𝓮 𝓵𝓸𝓬𝓪𝓽𝓲𝓸𝓷 𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯.
La plupart des frameworks s'occupent de stocker le domaine pour vous, vous voudrez donc consulter la documentation de votre framework particulier. Si vous n'utilisez pas de framework, envisagez de stocker le domaine dans l'un des endroits suivants:
+ ------------------------------------------------- --- + ----------------------------------- +
| Méthodes sécurisées de stockage du domaine | Utilisé par |
+ ------------------------------------------------- --- + ----------------------------------- +
| Un fichier de configuration | Joomla, Drupal / Symfony |
| La base de données | WordPress |
| Une variable environnementale | Laravel |
| Un registre de services | DNS Kubernetes |
+ ------------------------------------------------- --- + ----------------------------------- +
Vous pouvez utiliser les éléments suivants ... mais ils ne sont pas sécurisés
Les pirates peuvent faire en sorte que ces variables affichent le domaine de leur choix. Cela peut entraîner un empoisonnement du cache et des attaques de phishing à peine perceptibles.
$_SERVER['HTTP_HOST']
Cela obtient le domaine à partir des en-têtes de requête qui sont ouverts à la manipulation par les pirates . Même avec:
$_SERVER['SERVER_NAME']
Celui-ci peut être amélioré si le paramètre Apache usecanonicalname est désactivé; dans ce cas, $_SERVER['SERVER_NAME']
il ne sera plus autorisé à être rempli avec des valeurs arbitraires et sera sécurisé. Cependant, ce n'est pas le cas par défaut et n'est pas courant dans une configuration.
Dans les systèmes populaires
Voici comment vous pouvez obtenir le domaine actuel dans les frameworks / systèmes suivants:
WordPress
$urlparts = parse_url(home_url());
$domain = $urlparts['host'];
Si vous construisez une URL dans WordPress, utilisez simplement home_url ou site_url , ou l'une des autres fonctions URL .
Laravel
request()->getHost()
La request()->getHost
fonction est héritée de Symfony et est sécurisée depuis la mise à jour de la CVE-2013-4752 2013 .
Drupal
Le programme d'installation ne prend pas encore soin de rendre cela sécurisé ( problème # 2404259 ). Mais dans Drupal 8, il existe une documentation que vous pouvez suivre dans Paramètres d'hôte de confiance pour sécuriser votre installation Drupal, après quoi les éléments suivants peuvent être utilisés:
\Drupal::request()->getHost();
Autres cadres
N'hésitez pas à modifier cette réponse pour inclure comment obtenir le domaine actuel dans votre cadre préféré. Ce faisant, veuillez inclure un lien vers le code source pertinent ou vers tout autre élément qui m'aiderait à vérifier que le framework fait les choses en toute sécurité.
Addenda
Exemples d'exploitation:
Un empoisonnement du cache peut se produire si un botnet demande en permanence une page en utilisant le mauvais en-tête d'hôtes. Le code HTML résultant inclura alors des liens vers le site Web des attaquants où ils peuvent hameçonner vos utilisateurs. Au début, les liens malveillants ne seront renvoyés qu'au pirate, mais si le pirate fait suffisamment de requêtes, la version malveillante de la page se retrouvera dans votre cache où elle sera distribuée à d'autres utilisateurs.
Une attaque de phishing peut se produire si vous stockez des liens dans la base de données en fonction de l'en-tête hosts. Par exemple, supposons que vous stockiez l'URL absolue des profils d'un utilisateur sur un forum. En utilisant le mauvais en-tête, un pirate informatique peut amener quiconque clique sur le lien de son profil à se voir envoyer un site de phishing.
Un empoisonnement de réinitialisation de mot de passe peut se produire si un pirate informatique utilise un en-tête d'hôtes malveillants lorsqu'il remplit le formulaire de réinitialisation de mot de passe pour un autre utilisateur. Cet utilisateur recevra alors un e-mail contenant un lien de réinitialisation de mot de passe menant à un site de phishing.
Voici d' autres exemples malveillants
Mises en garde et remarques supplémentaires:
- Lorsque usecanonicalname est désactivé, le
$_SERVER['SERVER_NAME']
est rempli avec le même en-tête $_SERVER['HTTP_HOST']
que celui utilisé de toute façon (plus le port). Il s'agit de la configuration par défaut d'Apache. Si vous ou devops activez cela, alors tout va bien - ish - mais voulez-vous vraiment compter sur une équipe distincte, ou vous-même trois ans dans le futur, pour conserver ce qui semble être une configuration mineure à un non -valeur par défaut? Même si cela sécurise les choses, je vous déconseille de me fier à cette configuration.
- Redhat, cependant, active l'utilisation de Canon par défaut [ source ].
- Si serverAlias est utilisé dans l'entrée des hôtes virtuels et que le domaine avec alias est demandé,
$_SERVER['SERVER_NAME']
ne renverra pas le domaine actuel, mais renverra la valeur de la directive serverName.
- Si le nom du serveur ne peut pas être résolu, la commande hostname du système d'exploitation est utilisée à sa place [source] .
- Si l'en-tête de l'hôte est omis, le serveur se comportera comme si usecanonical était sur [source] .
- Enfin, j'ai juste essayé d'exploiter cela sur mon serveur local et je n'ai pas pu usurper l'en-tête d'hôtes. Je ne sais pas s'il y avait une mise à jour d'Apache qui a résolu ce problème, ou si je faisais simplement quelque chose de mal. Quoi qu'il en soit, cet en-tête serait toujours exploitable dans les environnements où les hôtes virtuels ne sont pas utilisés.
Little Rant:
Cette question a reçu des centaines de milliers de vues sans une seule mention des problèmes de sécurité à portée de main! Cela ne devrait pas être le cas, mais ce n'est pas parce qu'une réponse Stack Overflow est populaire, cela ne signifie pas qu'elle est sécurisée.