So erhalten Sie den Ursprung der HTTP-Anfrage in PHP

Lesezeit: 6 Minuten

Ich möchte eine API erstellen und um API-Konsumenten zu authentifizieren, werde ich einen API-SCHLÜSSEL, eine App-ID und ein App-Secret bereitstellen. Das Problem ist, dass ich wissen möchte, woher die HTTP-Anfrage kommt, damit ich wissen kann, ob der Host, der die Que-Anfrage stellt, der registrierte Host ist. Beispiel: www.someone.com hat eine App-ID: 0001, App-Secret: 1200 und API-Key: 458. Wenn diese Anmeldeinformationen verwendet werden, um eine A-Anfrage zu stellen, möchte ich wissen, ob der Anforderer wirklich www.someone.com ist

  • Verwenden Sie für den Ursprung dies header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN'] . ""); und überprüfen Sie dann die Anmeldeinformationen von der GET- oder POST-Variablen

    – hex494D49

    27. August 2014 um 6:15 Uhr

  • Die Verwendung des Ursprungs als Sicherheitsmaßnahme ist mehr als nutzlos. Dieser Header kann leicht gefälscht sein. Stattdessen möchten Sie vielleicht mit einem Rückruf arbeiten, um ein “Anforderungstoken” zu übergeben (denken Sie darüber nach, wie der Oauth-Fluss funktioniert).

    – PeeHaa

    27. August 2014 um 7:57 Uhr


  • Die Verwendung von HTTP_ORIGIN oder HTTP_REFERER ohne Überprüfung ist “im Wesentlichen” dasselbe wie die Verwendung von “*”, die subtile Sicherheitslücken öffnen kann, daher wird davon abgeraten, siehe stackoverflow.com/questions/12001269/…

    – Rogerpack

    14. April 2017 um 19:03 Uhr

  • Eine Antwort auf die eigentliche Frage “Wie bekomme ich den Ursprung der HTTP-Anfrage” finden Sie hier: stackoverflow.com/questions/41326257/…

    – Martin Schneider

    3. Juli 2017 um 17:24 Uhr


Benutzeravatar von hex494D49
hex494D49

Im Allgemeinen sollte dieser Header die Arbeit erledigen. Den Domainnamen in diesem Header haben

header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN'] . "");
// use domain name instead of $_SERVER['HTTP_ORIGIN'] above

Wenn Sie jedoch nach weiteren Informationen suchen möchten, verwenden Sie so etwas wie das folgende Snippet

$allowed = array('domain1', 'domain2', 'domain3'); 

if(isset($_SERVER['HTTP_ORIGIN']) && in_array($_SERVER['HTTP_ORIGIN'], $allowed)){
    // SELECT credentials for this user account from database
    if(isset($_GET['api_key'], $_GET['app_secret'])
        && $_GET['api_key'] == 'api_key_from_db' 
        && $_GET['app_secret'] == 'app_secret_from_db'
    ){
        // all fine
    }else{
        // not allowed
    }
}else{
    // not allowed
}

Wenn die Benutzer mehr Daten an Ihren Dienst übergeben müssen, verwenden Sie POST Anstatt von GET

  • Wenn der $_SERVER[‘REMOTE_ADDR’] Die Variable gibt mir die Client_IP und nicht die Website-Adresse zurück. Wie soll ich die Website authentifizieren?

    – m_junior

    27. August 2014 um 14:12 Uhr

  • @m_junior $_SERVER['REMOTE_ADDR'] gibt die IP-Adresse des Servers zurück, unter dem das aktuelle Skript ausgeführt wird.

    – hex494D49

    27. August 2014 um 14:18 Uhr


  • @m_junior Die $allowed Array von oben kann sogar so aussehen $allowed = array('domain1' => '1.2.3.4', 'domain2' => '5.6.7.8', 'domain3' => '2.4.6.8'); und dann können Sie verwenden gethostbyname('domain') und vergleichen Sie die zurückgegebene IP des Hosts mit der IP in Ihrem Array.

    – hex494D49

    27. August 2014 um 14:42 Uhr


  • @hex494D49 warum hast du meine Bearbeitung abgelehnt? Ihr Code hat 4 Syntaxfehler und ist nicht optimal für SO formatiert.

    – Martin Schneider

    3. Juli 2017 um 21:37 Uhr


  • Ich bin mir nicht mehr sicher, was passiert ist, als ich vor einem Jahr kommentiert habe. Wichtig ist das Array $allowed und das macht es zu einer guten Antwort.

    – Daniel W.

    4. Juli 2017 um 7:36 Uhr

Laravel 5: in Anforderungsmethode Controller:

$origin = request()->headers->get('origin');

  • um alle Header zu bekommen: request()->headers->all();

    – Kamil Kielczewski

    11. April 2019 um 13:41 Uhr


  • Kann ein Unbefugter nicht einfach die Request-Header in seinem Client ändern, um eine Domain einer autorisierten Domain zu senden und so die Prüfung umgehen?

    – alew

    4. Februar 2020 um 10:49 Uhr


  • Ich habe die Antwort gerade in einem anderen Thread gefunden: stackoverflow.com/a/21058346/4688612

    – alew

    4. Februar 2020 um 10:53 Uhr

  • origin wird nicht mit GET gesendet

    – Mangusta

    27. Mai 2020 um 1:45 Uhr

  • @mangusta Browser hinzufügen origin Header für CORS-Anfragen – mehr hier – wenn Sie keine CORS-Anfrage senden, fügt der Browser diesen Header nicht hinzu und php setzt ihn wahrscheinlich auch nicht (oder setzt wahrscheinlich einen Standardwert – aber ich überprüfe dies nicht auf der php-Seite).

    – Kamil Kielczewski

    27. Mai 2020 um 10:10 Uhr


Benutzeravatar von Sunit
Sonnet

Verwenden $_SERVER['HTTP_REFERER']. Es ist die Adresse der Seite (falls vorhanden), die den Benutzeragenten auf die aktuelle Seite verwiesen hat. Dies wird vom Benutzeragenten festgelegt. Nicht alle Benutzerprogramme werden dies festlegen, und einige bieten die Möglichkeit, Änderungen vorzunehmen HTTP_REFERER als Funktion.

Für weitere Einschränkungen können Sie Folgendes durchführen. example.com sollte auf Ihre Domain geändert werden.

IIS unten in der Webkonfiguration festgelegt:

add name="Access-Control-Allow-Origin" value="http://www.example.com"

Apache-Set unten in httpd.conf/apache.conf

Header add Access-Control-Allow-Origin "http://www.example.com"

  • Der Referrer und der Ursprung sind zwei verschiedene Dinge.

    – Daniel W.

    16. Juni 2016 um 14:15 Uhr

  • Nicht alle Benutzeragenten werden dies festlegen, und einige bieten die Möglichkeit, HTTP_REFERER als Funktion zu ändern. Kurz gesagt, es kann nicht wirklich vertraut werden.

    – Leonan Carvalho

    3. Februar 2017 um 11:00 Uhr

  • Eine bessere Antwort auf diese Frage finden Sie hier: stackoverflow.com/questions/41326257/…

    – Martin Schneider

    3. Juli 2017 um 17:23 Uhr

  • Wie @DanFromGermany bereits erwähnte, sind ORIGIN und REFERER zwei verschiedene Dinge – HTTP_ORIGIN ist in diesem Fall besser als HTTP_REFERER; wenn HTTP_ORIGIN fehlt, dann möchten Sie vielleicht auf die Nutzung zurückgreifen HTTP_REFERERaber ich würde aus Sicherheitsgründen davon abraten (es ist einfacher, den Referer als den Ursprung zu ändern, da der Ursprung als “verbotener” Header und Browser aufgeführt ist sollte Ursprungsänderungen verhindern).

    – SteJ

    23. April 2018 um 9:59 Uhr

Verwendung einer var_dump Sie können das alles sehen request hat anzubieten.

var_dump($_REQUEST);

Mach ein var_dump auf der server auch global. Es enthält viele nützliche Informationen.

var_dump($_SERVER);

Technisch auch nicht origin Noch referer HTTP-Header erforderlich sind, basieren alle diese Antworten auf bestimmten Browser-Headern, die gesendet werden, und es ist keine gute Idee, Ihr System auf unterschiedlichen Verhaltensweisen von Clients zu basieren.

Die richtige Antwort ist, dass Sie den Clientursprung nicht bei jeder Anfrage zuverlässig abrufen können, da er nicht als Teil der HTTP-Spezifikation erforderlich ist.

Benutzeravatar von Paolo Gibellini
Paolo Gibellini

Ich denke, was Sie meinen, ist, dass Sie auf den Header “Origin” in den Anforderungsheadern zugreifen möchten (im Gegensatz zum Festlegen in den Antwortheadern).

Dafür ist der einfachste Weg, auf das eingebaute zuzugreifen getallheaders() Funktion – was ein Alias ​​für ist apache_request_headers() – NB Dies setzt voraus, dass Sie PHP als Modul verwenden.

Dies gibt ein Array zurück, sodass der Origin-Header wie folgt verfügbar sein sollte:

$request_headers = getallheaders();
$origin = $request_headers['Origin'];

Wenn Sie PHP über so etwas wie fastcgi verwenden, wird es meiner Meinung nach in der Umgebung verfügbar gemacht – normalerweise groß geschrieben und mit “HTTP_” vorangestellt, so sollte es sein $_SERVER['HTTP_ORIGIN'].

Hoffe, das hilft jemandem, der danach sucht 🙂

Benutzeravatar von Ar0010r
Ar0010r

In Laravel 7 hat das bei mir funktioniert

Anfrage()->header->get(‘referer’);

  • überprüfen Sie es zuerst mit request()->headers; dann können Sie “->get(‘ ..needed parameter.. ‘);” hinzufügen

    – Vit

    3. April 2020 um 12:48 Uhr

1430390cookie-checkSo erhalten Sie den Ursprung der HTTP-Anfrage in PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy