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
So erhalten Sie den Ursprung der HTTP-Anfrage in PHP
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 verwendengethostbyname('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
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 alsHTTP_REFERER
; wennHTTP_ORIGIN
fehlt, dann möchten Sie vielleicht auf die Nutzung zurückgreifenHTTP_REFERER
aber 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.
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 🙂
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
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