Aktuelle Domain abrufen

140

Ich habe meine Seite auf dem Server

http://www.myserver.uk.com

Dafür habe ich zwei Domains,

http://one.com

und

http://two.com

Ich würde gerne mit PHP die aktuelle Domain bekommen, aber wenn ich sie benutze $_SERVER['HTTP_HOST']dann zeige mir das

myserver.uk.com

anstatt:

one.com or two.com

Wie kann ich die Domain erhalten, nicht den Servernamen?

Ich habe PHP Version 5.2.

Tony Evyght
quelle
Sie können nur primäre URl erhalten. Welches ist die Grundschule unter diesen drei?
Code Spy
2
Genau wie leiten Ihre beiden Domains Anfragen an Ihren Server weiter?
Xiaofeng.li
1
@infgeoax wahrscheinlich ein Frame ...
CodeCaster
Primär ist myserver.uk.com. Wie kann ich den aktuellen Domainnamen erhalten? Wenn ich eine Website mit der Adresse one.com öffne, möchte ich one.com anstelle von myserver.uk.com
Tony Evyght
@ TonyEvyght das ist der Punkt infgeoax und ich versuche zu machen, sollten Sie den Hostnamen bekommen, mit dem Sie sich verbinden $_SERVER['HTTP_HOST']. Wenn die Websites one.comund two.commithilfe eines (i) Frames "umgeleitet" werden, stammt die Seite selbst immer noch von myserver.uk.com, sodass Sie nicht die echte Domain erhalten. Wofür ist die HTML-Quelle one.com?
CodeCaster

Antworten:

175

Versuchen Sie Folgendes: $_SERVER['SERVER_NAME']

Oder analysieren

$_SERVER['REQUEST_URI']

apache_request_headers ()

eine Hälfte
quelle
23
-1: Allein mit dieser Antwort weiß ich nicht genau, was die verschiedenen Vorschläge, die ich betrachte, bewirken. Sicher, das gibt mir einen Punkt, von dem ich weiter schauen kann, aber an sich ist dies wirklich keine gute Antwort ...
Jasper
4
nur print_r (apache_request_headers ()) und du wirst alles verstehen :)
Hälfte
2
@SarahLewis HTTP_X_ORIGINAL_HOSTkann vom Benutzer geändert werden und ist nicht vertrauenswürdig. Dies ist möglicherweise nicht immer ein Problem, aber es ist etwas, das Sie beachten sollten.
wp-overwatch.com
64

Die beste Verwendung wäre

echo $_SERVER['HTTP_HOST'];

Und es kann so verwendet werden:

if (strpos($_SERVER['HTTP_HOST'], 'banana.com') !== false) {
    echo "Yes this is indeed the banana.com domain";
}

Mit dem folgenden Code können Sie alle Variablen in $ _SERVER in einer strukturierten HTML-Ausgabe anzeigen, wobei Ihre Schlüsselwörter hervorgehoben sind und direkt nach der Ausführung angehalten werden. Da ich manchmal vergesse, welches ich selbst verwenden soll, denke ich, dass dies geschickt sein kann.

<?php
    // Change banana.com to the domain you were looking for..
    $wordToHighlight = "banana.com";
    $serverVarHighlighted = str_replace( $wordToHighlight, '<span style=\'background-color:#883399; color: #FFFFFF;\'>'. $wordToHighlight .'</span>',  $_SERVER );
    echo "<pre>";
    print_r($serverVarHighlighted);
    echo "</pre>";
    exit();
?>
K. Kilian Lindberg
quelle
39

Mit $_SERVER['HTTP_HOST']bekommt ich (Subdomain.) Maindomain.extension. Es scheint mir die einfachste Lösung zu sein.

Wenn Sie tatsächlich über einen iFrame umleiten, können Sie einen GET- Parameter hinzufügen , der die Domäne angibt.

<iframe src="myserver.uk.com?domain=one.com"/>

Anschließend können Sie eine Sitzungsvariable festlegen, die diese Daten in Ihrer gesamten Anwendung beibehält.

Raz0rwire
quelle
1
Am wichtigsten ist, dass es die Portnummer enthält, damit ich sie danach nicht mehr bearbeiten muss. Die von bsdnoobz vorgeschlagene phpinfo hilft mir jedoch, die richtige Lösung zu finden.
30

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.



wp-overwatch.com
quelle
1
Vielleicht möchten Sie den Unterschied zwischen home_url und site_url erwähnen. wordpress.stackexchange.com/a/50605/13
Volomike
1
+1 für WordPress-Benutzer. Gut, wenn Sie prüfen müssen, ob es im Unterverzeichnis installiert ist, aber beachten Sie, dass der Schlüssel parse_url: $urlparts['path']nicht festgelegt ist, wenn er im Stammverzeichnis der Domäne installiert ist. Andernfalls wird $urlparts['path']das Unterverzeichnis zurückgegeben.
Jonas Lundman
9

Versuchen Sie es $_SERVER['SERVER_NAME'].

Tipps: Erstellen Sie eine PHP-Datei, die die Funktion aufruft, phpinfo()und lesen Sie den Abschnitt "PHP-Variablen". Es gibt eine Reihe nützlicher Variablen, an die wir dort nie denken.

flussfrei
quelle
Sie können jederzeit versuchen, den $ _SERVER zu drucken und zu suchen
3

Ich weiß, dass dies möglicherweise nicht vollständig mit dem Thema zu tun hat, aber meiner Erfahrung nach finde ich es nützlich, das WWW der aktuellen URL in einer Variablen zu speichern.

Bearbeiten: Zusätzlich lesen Sie bitte meinen Kommentar unten, um zu sehen, worum es geht.

Dies ist wichtig, wenn Sie festlegen möchten, ob Ajax-Anrufe mit oder ohne "www" versendet werden sollen:

$.ajax("url" : "www.site.com/script.php", ...

$.ajax("url" : "site.com/script.php", ...

Beim Versenden eines Ajax-Anrufs muss der Domänenname mit dem in der Adressleiste des Browsers übereinstimmen. Andernfalls wird Uncaught SecurityError in der Konsole angezeigt .

Deshalb habe ich diese Lösung gefunden, um das Problem zu beheben:

<?php
    substr($_SERVER['SERVER_NAME'], 0, 3) == "www" ? $WWW = true : $WWW = false;

    if ($WWW) {
        /* We have www.example.com */
    } else {
        /* We have example.com */
    }
?>

Führen Sie dann basierend darauf, ob $ WWW wahr oder falsch ist, den richtigen Ajax-Aufruf aus.

Ich weiß, dass dies trivial klingen mag, aber dies ist ein so häufiges Problem, über das man leicht stolpern kann.

InfiniteStack
quelle
OP hat explizit nach der Domain gefragt und nicht nach SERVER_NAME .
Sebastian G. Marinescu
Stimmt, aber heutzutage müssen Sie sich auch um das WWW-Problem kümmern.
InfiniteStack
Warum? In JS könnte man reinschauen window.location. In PHP hast du SERVER_NAME.
Sebastian G. Marinescu
4
SERVER_NAME gibt "www.site.com" zurück, auch wenn "site.com" in die Adressleiste eingegeben wird. Wenn Sie SERVER_NAME in Ihrem gesamten Code verwenden, werden Sie unweigerlich auf das Sicherheitsproblem www / no-www stoßen, insbesondere wenn Sie Ajax-Anrufe tätigen. Um Ihre Frage zu beantworten, muss PHP in der erweiterten PHP-Programmierung manchmal dynamisch Code generieren, der einen HTTP-Aufruf an den Server ausführt. Wenn die Ziel-URL "www" auf einer Seite enthält, die dies nicht tut, wird ein Sicherheitsfehler generiert.
InfiniteStack
Ok ok ... Ich habe darüber gelesen und du hast recht. Ihre Antwort könnte also für jemanden relevant sein. Gute Arbeit :)
Sebastian G. Marinescu
3

Jeder verwendet die parse_urlFunktion, aber manchmal übergibt der Benutzer das Argumet in einem anderen Format.

Um dies zu beheben, habe ich die Funktion erstellt. Überprüfen Sie dies heraus:

function fixDomainName($url='')
{
    $strToLower = strtolower(trim($url));
    $httpPregReplace = preg_replace('/^http:\/\//i', '', $strToLower);
    $httpsPregReplace = preg_replace('/^https:\/\//i', '', $httpPregReplace);
    $wwwPregReplace = preg_replace('/^www\./i', '', $httpsPregReplace);
    $explodeToArray = explode('/', $wwwPregReplace);
    $finalDomainName = trim($explodeToArray[0]);
    return $finalDomainName;
}

Übergeben Sie einfach die URL und erhalten Sie die Domain.

Beispielsweise,

echo fixDomainName('https://stackoverflow.com');

wird das Ergebnis zurückgeben wird sein

stackoverflow.com

Und in einigen Situationen:

echo fixDomainName('stackoverflow.com/questions/id/slug');

Und es wird auch zurückkehren stackoverflow.com.

Manojkiran.A
quelle
1
$_SERVER['HTTP_HOST'] 

// um die Domain zu bekommen

$protocol=strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === FALSE ? 'http' : 'https';
$domainLink=$protocol.'://'.$_SERVER['HTTP_HOST'];

// Domain mit Protokoll

$url=$protocol.'://'.$_SERVER['HTTP_HOST'].'?'.$_SERVER['QUERY_STRING'];

// Protokoll, Domain, AbfrageString gesamt ** Da $ _SERVER ['SERVER_NAME'] für Multi-Domain-Hosting nicht zuverlässig ist!

Sarkar
quelle
-2

Versuchen Sie einfach:

echo apache_request_headers()[3];
Bewegung
quelle