it-swarm.com.de

Wie kann ich Origin of Request mit PHP bekommen?

Wenn jemand eine XHR-Anfrage von some-client.com an some-rest.com sendet, möchte ich Origin ( Domainname, nicht Client-IP ) der Anfrage mit PHP erhalten.

Die möglichen Lösungen:

  • Vielleicht kann ich $_SERVER['HTTP_Origin'] verwenden, aber ich weiß nicht, ob es ein Standard ist.
  • Ich sehe einen anderen Header wie $_SERVER['HTTP_Host'] oder $_SERVER['SERVER_NAME'], aber in einigen Fällen wird die echte hostname und nicht die echte domain zurückgegeben.
  • Und $_SERVER['REMOTE_ADDR'] gibt die Client-IP an.

Was ist der richtige Weg, um Origin of Request wie einen Domainnamen mit PHP zu bekommen?

Vielen Dank!

5
Olaf Erlandsen

Gemäß dem Artikel HTTP-Zugriffskontrolle (CORS) von MDN:

Für alle Anforderungen muss der Header Origin gesetzt sein, damit er unter dem CORS-Mechanismus (Cross-Origin-Ressourcenfreigabe) ordnungsgemäß funktioniert.

Der Anforderungsheader " Origin " ist Teil von RFC 6454 und beschreibt ihn als Teil des CORS-Mechanismus und ist gemäß MDN mit allen Browsern kompatibel.

Beschreibung von MDN:

Der Anforderungsheader Origin gibt an, woher ein Abruf stammt. Es enthält keine Pfadinformationen, sondern nur den Servernamen. Es wird Mit CORS-Anforderungen sowie mit POST-Anforderungen gesendet. Es ähnelt Der Referer-Kopfzeile, aber im Gegensatz zu dieser Kopfzeile gibt Nicht den gesamten Pfad an.

Quelle: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin

Beispiel nach MDN: enter image description here

Um Origin der XHR-Anfrage mit PHP zu erhalten, können Sie: verwenden

$_SERVER['HTTP_Origin'] 

Und im Falle einer direkten Anfrage, Sie können kombinierenHTTP_REFERER und REMOTE_ADDR wie:

if (array_key_exists('HTTP_REFERER', $_SERVER)) {
    $Origin = $_SERVER['HTTP_REFERER'];
} else {
    $Origin = $_SERVER['REMOTE_ADDR'];
}

Die mögliche Endlösung lautet also:

if (array_key_exists('HTTP_Origin', $_SERVER)) {
    $Origin = $_SERVER['HTTP_Origin'];
}
else if (array_key_exists('HTTP_REFERER', $_SERVER)) {
    $Origin = $_SERVER['HTTP_REFERER'];
} else {
    $Origin = $_SERVER['REMOTE_ADDR'];
}

MDN ist Mozilla Developer Network .

Vielen Dank für die Hilfe @trine, @ waseem-bashir, @ p0lt10n und andere Personen.

11
Olaf Erlandsen

in PHP können Sie $ _SERVER ['HTTP_REFERER']. verwenden, wenn Sie Codeigniter verwenden. Dann können Sie den Referrer mit $ this-> agent-> is_referral () beziehen. 

1
Waseem Bashir
$_SERVER['HTTP_Origin']  // HTTP Origin header
$_SERVER['HTTP_Host']    // HTTP Host header
$_SERVER['HTTP_REFERER'] // HTTP Referer header
$_SERVER['REMOTE_ADDR']  // HTTP Client's Public IP

Lassen Sie uns die obigen $_SERVER-Parameter besprechen.

Erstens ist XHR auf der Clientseite und grenzt an einen http-Client. Da Origin- und Referer-Header nicht obligatorisch sind, wird dies nicht für einen anderen Client als den Standard-Webbrowser festgelegt. Der Header des nächsten Hosts ist möglicherweise nicht obligatorisch. Wenn Ihr REST Server virtuelle Hosts verwendet, ist dieser Header ein Muss, um Anforderungen korrekt weiterzuleiten. Dieser Header enthält jedoch keine Details zum Client. Einzige Besonderheit für den http-Client ist Public IP. Dies entspricht jedoch vielen Clients, da ISPs Netzwerkadressenübersetzungen oder Proxys verwenden.

Da alles relativ ist und sich innerhalb der Grenzen befindet, sind CORS ähnliche Mechanismen auf dem HTTP Origin-Header aufgebaut. Es wird davon ausgegangen, dass Clients Standardbrowser verwenden.

In Ihrem Fall ist es meiner Meinung nach in Ordnung, sich auf den Origin-Header zu verlassen. Sie können CORS Mechanismus implementieren, wenn es für Sie geeignet ist.

1
TRiNE