it-swarm.com.de

Gibt es $ _SERVER ['HTTP_X_REQUESTED_WITH'] in PHP oder nicht?

Im gesamten Internet, auch hier bei Stack Overflow, wird angegeben, dass eine gute Methode zum Überprüfen, ob eine Anforderung AJAX ist oder nicht, die folgenden Schritte erfordert:

if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) {...}

Ich sehe jedoch $_SERVER['HTTP_X_REQUESTED_WITH'] nicht in der offiziellen PHP Dokumentation .

Und wenn ich versuche Folgendes zu tun:

echo $_SERVER['HTTP_X_REQUESTED_WITH'];

Nichts wird ausgegeben.

Mache ich etwas falsch? Weil ich $_SERVER['HTTP_X_REQUESTED_WITH'] gerne benutzen möchte, wenn es verfügbar ist.

63
Hank

Die Variablen in $_SERVER sind nicht wirklich Teil von PHP, weshalb Sie sie nicht in der PHP -Dokumentation finden. Sie werden vom Webserver vorbereitet, der sie an die Skriptsprache weiterleitet.

Soweit ich weiß, wird der X-Requested-With von den Ajax-Funktionen der meisten großen Frameworks gesendet, aber nicht von allen (Dojo beispielsweise hat es erst vor zwei Jahren hinzugefügt: # 5801 ). Unter Berücksichtigung der Erwägungen von @bobince kann man mit Sicherheit sagen, dass es im Allgemeinen keine zu 100% zuverlässige Methode ist, um zu bestimmen, ob eine Anforderung eine AJAX - Anforderung ist oder nicht. 

Der einzig sichere Weg ist, ein vordefiniertes Flag (z. B. eine GET-Variable) zusammen mit der Anfrage zu senden und die empfangende Seite auf das Vorhandensein dieses Flag zu prüfen. 

58
Pekka 웃

vergessen Sie nicht, dass Sie jede Kopfzeile mit cURL so spoofen können

curl_setopt($ch,CURLOPT_HTTPHEADER,array("X-Requested-With : XMLHttpRequest"));
27

$_SERVER-Schlüssel, die mit HTTP_ beginnen, werden aus HTTP-Anforderungsheadern generiert. In diesem Fall der X-Requested-With-Header.

Dieser Header ist eine Standardisierung in Bearbeitung von allen AJAX - Bibliotheken.

Es wird nicht in der PHP-Dokumentation selbst dokumentiert, sondern in den verschiedenen AJAX -Bibliotheken, die diesen Header setzen. Übliche Bibliotheken haben diesen Header gesendet: jQuery, Mojo, Prototype, ...

Normalerweise setzen diese Bibliotheken den Header mit 

xhrobj.setRequestHeader("X-Requested-With", "XMLHttpRequest");
11
Jerome WAGNER

Hier ist eine schnelle Funktion mit Beispielanwendung:

function isXmlHttpRequest()
{
    $header = isset($_SERVER['HTTP_X_REQUESTED_WITH']) ? $_SERVER['HTTP_X_REQUESTED_WITH'] : null;
    return ($header === 'XMLHttpRequest');
}

// example - checking our active call
if(!isXmlHttpRequest())
{
    echo 'Not an ajax request';
}
else
{
    echo 'is an ajax request';
}
4
tfont
echo $_SERVER['HTTP_X_REQUESTED_WITH'];

Was erwartest du von einem solchen Code? Angenommen, Sie führen es direkt über den Browser aus und verwenden keine AJAX Anfrage. Wie konnte dieser Header gesetzt werden?

Nun, die Antwort auf die ultimative Frage des Lebens, des Universums und alles - ein HTTP-Sniffer ! Holen Sie sich eins und vergessen Sie den Ausdruck der $ _SERVER-Variablen. 

Firebug hat einen oder Sie möchten Fiddler HTTP Proxy oder LiveHTTPHeaders Mozilla Plugin verwenden. Es ist mir langweilig, Links zu machen, aber es wird leicht gegoogelt. 

Mit HTTP-Sniffer können Sie sich also auf jeden HTTP-Header verlassen.

Beachten Sie, dass Sie keinen "direkten Zugriff" mit XHR verhindern können, da jede HTTP-Anforderung an Ihren Server bereits "direkt" ist.

3

Sie können auch einige Browserfehler beschuldigen - siehe diese Frage und ihre Lösung für Firefox

Firefox bewahrt keine benutzerdefinierten Header während der Ajax-Anforderungsumleitung: eine ASP.NET-MVC-Lösung

IE hat auch caching issue , was schwerwiegender ist als die Erkennung der Anforderungsmethode.

Sie müssen auf jeden Fall Cache-Busters hinzufügen, um das Caching zu vermeiden. Warum also nicht mit einem anderen Flag den Ajax-Aufruf angeben? Oder besser, Sie können eine andere URL wie http://ajax.mysite.com/endpoint/sevice?params verwenden

1
EGL 2-101
$headers = Apache_request_headers();
$is_ajax = (isset($headers['X-Requested-With']) && $headers['X-Requested-With'] == 'XMLHttpRequest');
1
revoke

Die beste Lösung, um sicherzustellen, dass eine HTTP-Anforderung wirklich über AJAX gesendet wird, verwendet die SESSION-Prüfung. Sie senden session_id in einem get-Parameter und überprüfen diese Sitzung, ob sie zulässig ist oder nicht. 

0

Ich stimme Pekka zu. Es gibt keine zuverlässige systemeigene Methode zwischen Vorder- und Rückseite, die automatisch erkennen kann, ob ein Client tatsächlich einen Endpunkt mit AJAX aufruft.

Für meinen eigenen Gebrauch habe ich einige Möglichkeiten, um zu überprüfen, ob ein Client einen meiner Endpunkte anfordert:

  1. Ich kann HTTP_X_REQUESTED_WITH verwenden, wenn ich nicht im domänenübergreifenden Kontext bin.

  2. anstatt "X-request-with" zu prüfen, überprüfe ich $ _SERVER ['HTTP_Origin'] (das von AJAX request gesendet wird) und beabsichtige, domänenübergreifende Berechtigungen zu verarbeiten. Der Hauptgrund, warum ich prüfe, ob es sich bei einer Anforderung um eine AJAX Anforderung handelt, ist vor allem auf domänenübergreifende Berechtigungen zurückzuführen, die diesen PHP Code: header ('Access- Control-Allow-Origin: '. $ _ SERVER [' HTTP_Origin ']); // Wenn diese "HTTP_Origin" in meiner Positivliste ist

  3. meine APIs erwarten vom Client, dass in einigen Fällen der Datentyp (JSON, HTML usw.) in einem GET oder einer POST var explizit angegeben wird. Ich überprüfe zum Beispiel, ob $ _REQUEST ['ajax'] nicht leer ist oder einem erwarteten Wert entspricht.

0
FragBis