web-dev-qa-db-ger.com

So erhalten Sie eine http-Anfrage Origin in PHP

Ich möchte eine API erstellen und API-Konsumenten authentifizieren. Ich werde einen API-KEY, eine App-ID und ein App-Secret bereitstellen. Das Problem ist, dass ich wissen möchte, woher die http-Anfrage kommt, damit ich weiß, ob der Host, der die Warteschlangenanfrage stellt, der registrierte Host ist. Beispiel: www.someone.com hat eine App-ID: 0001, ein App-Geheimnis: 1200 und einen API-Schlüssel: 458. Wenn diese Anmeldeinformationen verwendet werden, um eine Anfrage zu stellen, möchte ich wissen, ob der Anforderer wirklich www.someone.com ist

5
m_junior

Verwenden Sie $_SERVER['HTTP_REFERER']. Dies ist die Adresse der Seite (falls vorhanden), die den Benutzeragenten auf die aktuelle Seite verwiesen hat. Dies wird vom Benutzeragenten festgelegt. Nicht alle Benutzerprogramme legen dies fest, und einige bieten die Möglichkeit, HTTP_REFERER als Funktion zu ändern.

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

IIS unten in der Webkonfiguration eingestellt :

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

Apache unter httpd.conf/Apache.conf

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

Im Allgemeinen sollte dieser Header den Job 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 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 anstelle von GET.

16
hex494D49

Ich denke, was Sie meinen, ist, dass Sie auf den "Ursprung" -Header in den Anforderungsheader zugreifen möchten (anstatt ihn in den Antwortheader zu setzen).

Zu diesem Zweck ist es am einfachsten, auf die integrierte Funktion getallheaders () zuzugreifen, die ein Alias ​​für Apache_request_headers () - N.B. ist. Dies setzt voraus, dass Sie PHP als Modul verwenden.

Dies gibt ein Array zurück, so dass 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 zur Verfügung gestellt - normalerweise großgeschrieben und mit dem Präfix "HTTP_" versehen, also sollte es $_SERVER['HTTP_Origin'] sein.

Hoffe das hilft allen anderen die danach suchen :)

2
sensadrome

Mit einem var_dump können Sie alles sehen, was die request zu bieten hat.

var_dump($_REQUEST);

Führe auch einen var_dump für die server global aus. Es enthält viele nützliche Informationen.

var_dump($_SERVER);
1
Peter

Laravel 5 : in request method controller:

$Origin = request()->headers->get('Origin');
1