Der einzig sichere Weg, dies zu tun
Alle anderen Antworten auf dieser Seite haben Auswirkungen auf die Sicherheit, die Sie beachten müssen.
Die einzige garantierte sichere Methode zum Abrufen der aktuellen Domain
ist zu 𝓼𝓽𝓸𝓻𝓮 𝓲𝓽 𝓲𝓷 𝓪 𝓼𝓮𝓬𝓾𝓻𝓮 𝓼𝓮𝓬𝓾𝓻𝓮 𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯.
Die meisten Frameworks kümmern sich darum, die Domain für Sie zu speichern. Lesen Sie daher die Dokumentation zu Ihrem speziellen Framework. Wenn Sie kein Framework verwenden, sollten Sie die Domain an einem der folgenden Orte speichern:
+ --------------------------------------------- --- + ----------------------------------- +
| Sichere Methoden zum Speichern der Domain | Verwendet von |
+ --------------------------------------------- --- + ----------------------------------- +
| Eine Konfigurationsdatei | Joomla, Drupal / Symfony |
| Die Datenbank | WordPress |
| Eine Umgebungsvariable | Laravel |
| Eine Serviceregistrierung | Kubernetes DNS |
+ --------------------------------------------- --- + ----------------------------------- +
Sie können Folgendes verwenden ... aber sie sind unsicher
Hacker können diese Variablen dazu bringen, jede gewünschte Domäne auszugeben. Dies kann zu Cache-Vergiftungen und kaum wahrnehmbaren Phishing-Angriffen führen.
$_SERVER['HTTP_HOST']
Dadurch wird die Domain aus den Anforderungsheadern abgerufen, die von Hackern manipuliert werden können . Das gleiche mit:
$_SERVER['SERVER_NAME']
Dieser kann verbessert werden, wenn die Apache-Einstellung usecanonicalname deaktiviert ist. In diesem Fall $_SERVER['SERVER_NAME']darf es nicht mehr mit beliebigen Werten gefüllt werden und ist sicher. Dies ist jedoch nicht die Standardeinstellung und bei einem Setup nicht üblich.
In gängigen Systemen
Im Folgenden erfahren Sie, wie Sie die aktuelle Domain in den folgenden Frameworks / Systemen abrufen können:
WordPress
$urlparts = parse_url(home_url());
$domain = $urlparts['host'];
Wenn Sie eine URL in WordPress erstellen , verwenden Sie einfach home_url oder site_url oder eine der anderen URL-Funktionen .
Laravel
request()->getHost()
Die request()->getHostFunktion wurde von Symfony geerbt und ist seit dem Patchen des CVE-2013-4752 2013 sicher .
Drupal
Das Installationsprogramm kümmert sich noch nicht darum, dies sicher zu machen ( Problem # 2404259 ). In Drupal 8 gibt es jedoch eine Dokumentation, die Sie in den Einstellungen für vertrauenswürdige Hosts befolgen können , um Ihre Drupal-Installation zu sichern. Anschließend können Sie Folgendes verwenden:
\Drupal::request()->getHost();
Andere Rahmenbedingungen
Sie können diese Antwort jederzeit bearbeiten, um anzugeben, wie Sie die aktuelle Domain in Ihr bevorzugtes Framework aufnehmen können. Fügen Sie dabei bitte einen Link zum entsprechenden Quellcode oder zu anderen Elementen hinzu, mit denen ich überprüfen kann, ob das Framework die Dinge sicher ausführt.
Nachtrag
Ausbeutungsbeispiele:
Eine Cache-Vergiftung kann auftreten, wenn ein Botnetz kontinuierlich eine Seite mit dem falschen Host-Header anfordert. Der resultierende HTML-Code enthält dann Links zur Website des Angreifers, auf der er Ihre Benutzer fischen kann. Zuerst werden die böswilligen Links nur an den Hacker zurückgesendet. Wenn der Hacker jedoch genügend Anfragen ausführt, landet die böswillige Version der Seite in Ihrem Cache, wo sie an andere Benutzer verteilt wird.
Ein Phishing-Angriff kann auftreten, wenn Sie Links basierend auf dem Host-Header in der Datenbank speichern. Angenommen, Sie speichern die absolute URL zu den Profilen eines Benutzers in einem Forum. Durch die Verwendung des falschen Headers kann ein Hacker jedem, der auf seinen Profillink klickt, eine Phishing-Site senden.
Eine Vergiftung durch Zurücksetzen von Passwörtern kann auftreten, wenn ein Hacker beim Ausfüllen des Formulars zum Zurücksetzen von Passwörtern für einen anderen Benutzer einen böswilligen Host-Header verwendet. Dieser Benutzer erhält dann eine E-Mail mit einem Link zum Zurücksetzen des Passworts, der zu einer Phishing-Site führt.
Hier sind einige weitere böswillige Beispiele
Zusätzliche Vorsichtsmaßnahmen und Hinweise:
- Wenn usecanonicalname deaktiviert ist, wird der
$_SERVER['SERVER_NAME']mit demselben Header $_SERVER['HTTP_HOST']gefüllt, der sowieso verwendet worden wäre (plus Port). Dies ist das Standard-Setup von Apache. Wenn Sie oder Entwickler dies aktivieren, sind Sie in Ordnung, aber möchten Sie sich wirklich auf ein separates Team oder auf sich selbst in drei Jahren in der Zukunft verlassen, um eine scheinbar geringfügige Konfiguration bei einem Nicht-Team beizubehalten -Standardwert? Auch wenn dies die Sicherheit erhöht, würde ich davor warnen, mich auf dieses Setup zu verlassen.
- Redhat schaltet jedoch standardmäßig usecanonical ein [ Quelle ].
- Wenn serverAlias im Eintrag für virtuelle Hosts verwendet wird und die Alias-Domäne angefordert wird,
$_SERVER['SERVER_NAME']wird nicht die aktuelle Domäne zurückgegeben, sondern der Wert der Anweisung serverName.
- Wenn der Servername nicht aufgelöst werden kann, wird an seiner Stelle [Quelle] der Befehl hostname des Betriebssystems verwendet .
- Wenn der Host-Header weggelassen wird, verhält sich der Server so, als wäre usecanonical auf [source] .
- Zuletzt habe ich versucht, dies auf meinem lokalen Server auszunutzen, und konnte den Host-Header nicht fälschen. Ich bin mir nicht sicher, ob es ein Update für Apache gab, das dies behebt, oder ob ich nur etwas falsch gemacht habe. Unabhängig davon wäre dieser Header in Umgebungen, in denen keine virtuellen Hosts verwendet werden, weiterhin ausnutzbar.
Little Rant:
Diese Frage erhielt Hunderttausende von Ansichten ohne eine einzige Erwähnung der vorliegenden Sicherheitsprobleme! Es sollte nicht so sein, aber nur weil eine Stapelüberlauf-Antwort beliebt ist, heißt das nicht, dass sie sicher ist.