73 votes

N' $_SERVER['HTTP_X_REQUESTED_WITH'] existe pas en PHP ou pas?

Partout sur l'Internet, inclus, même ici, à Débordement de Pile, les gens de l'état qu'un bon moyen de vérifier si une requête AJAX ou pas, c'est de faire ce qui suit:

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

Cependant, je ne vois pas $_SERVER['HTTP_X_REQUESTED_WITH'] dans la documentation officielle de PHP

Et quand j'essaie de faire ce qui suit:

echo $_SERVER['HTTP_X_REQUESTED_WITH'];

Rien n'est sorti.

Suis-je en train de faire quelque chose de mal? Parce que je voudrais vraiment être en mesure d'utiliser $_SERVER['HTTP_X_REQUESTED_WITH'] si elle est disponible.

64voto

Pekka 웃 Points 249607

Les variables en $_SERVER ne font pas vraiment partie de PHP, qui est pourquoi vous ne trouverez pas dans la documentation de PHP. Ils sont préparés par le serveur Web qui transmet le langage de script.

Autant que je sache, l' X-Requested-With est envoyé par l'Ajax fonctions de la plupart des principaux Cadres, mais pas tous (Dojo, par exemple, ajouté seulement il y a deux ans: #5801). En tant que tel, et en tenant compte du @bobince commentaires, il est sûr de dire que c'est généralement pas un 100% méthode fiable pour déterminer si une requête est une requête AJAX ou pas.

Le seul 100% sécurisé consiste à envoyer un pré-définis drapeau (par exemple, une variable) avec la demande et de la réception de la page pour vérifier la présence de ce drapeau.

27voto

J. Michael Wilson Points 391

n'oubliez pas que vous pouvez facilement usurper un en-tête avec cURL comme

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

19voto

$_SERVER clés qui commencent par HTTP_ sont générés à partir des en-têtes de requête HTTP. Dans ce cas, l' X-Requested-With - tête.

18voto

Jerome WAGNER Points 6622

Cet en-tête est une normalisation en cours de la totalité de l'AJAX bibliothèques.

Il ne sera pas documentée dans la documentation php, per se, mais plutôt dans les différentes bibliothèques AJAX que mettre cet en-tête. Commune de bibliothèques envoyé cet en-tête: jQuery, Mojo, Prototype, ...

Habituellement, ces bibliothèque de la tête à l'aide de

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

3voto

echo $_SERVER['HTTP_X_REQUESTED_WITH'];

Qu'avez-vous attendre d'un tel code? Supposons que vous êtes en cours d'exécution directement à partir du navigateur, ne pas utiliser une requête AJAX. Alors, comment se fait cet en-tête peut être réglé?

Eh bien la Réponse à la Question Ultime de la Vie, l'Univers, et de Tout - un HTTP sniffer! Vous obtenez l'un et oublier d'impression $_SERVER variable.

Firebug en a un, ou vous pouvez utiliser de la Fiddler est un proxy HTTP ou LiveHTTPHeaders plugin Mozilla. J'en ai marre de faire des liens, mais il facilement sur google.

Donc, avec HTTP sniffer vous pouvez être sûr de tout en-tête HTTP à jamais.

Notez que vous ne pouvez pas éviter toute "accès direct" à l'aide d'XHR, comme chaque requête HTTP vers votre serveur est déjà en "direct".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X