not http_x_requested_with check _server php ajax http-headers

php - check - $_server[''http_x_requested_with'']



¿$_SERVER[''HTTP_X_REQUESTED_WITH''] existe en PHP o no? (10)

En todo Internet, incluido incluso aquí en Stack Overflow, las personas afirman que una buena forma de verificar si una solicitud es AJAX o no es hacer lo siguiente:

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

Sin embargo, no veo $_SERVER[''HTTP_X_REQUESTED_WITH''] en la documentación oficial de PHP

Y cuando trato de hacer lo siguiente:

echo $_SERVER[''HTTP_X_REQUESTED_WITH''];

Nada es enviado.

¿Estoy haciendo algo mal? Porque realmente me gustaría poder usar $_SERVER[''HTTP_X_REQUESTED_WITH''] si está disponible.


Este encabezado es una estandarización en progreso de todas las bibliotecas de AJAX.

No se documentará en la documentación de php per-se, sino en las diferentes bibliotecas de AJAX que configuran este encabezado. Las bibliotecas comunes envían este encabezado: jQuery, Mojo, Prototype, ...

Por lo general, esta biblioteca configurará el encabezado usando

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


Estoy de acuerdo Pekka. No existe un método nativo confiable entre el anverso y el reverso que pueda detectar automáticamente si un cliente realmente llama a un punto final usando AJAX.

Para mi propio uso, tengo pocas formas principales de verificar si un cliente está solicitando uno de mis puntos finales:

  1. Puedo usar HTTP_X_REQUESTED_WITH cuando no estoy en contexto de dominio cruzado.

  2. en lugar de marcar "X-requested-with", estoy comprobando $ _SERVER [''HTTP_ORIGIN''] (que se envía desde la solicitud AJAX) con la intención de manejar permisos de dominio cruzado. La mayoría de las veces, la razón principal por la que estoy comprobando si una solicitud es una solicitud de AJAX, es especialmente debido a los permisos de dominio cruzado, usando este código PHP: header (''Access-Control-Allow-Origin:''. $ _ SERVER ['' HTTP_ORIGIN '']); // Si este "HTTP_ORIGIN" está en mi lista blanca

  3. mis API esperan que el cliente explicite, en algunos casos, el tipo de datos (JSON, HTML, etc.) en una variable GET o POST. Por ejemplo, verifico si $ _REQUEST [''ajax''] no está vacío o es igual a un valor esperado.


La mejor solución para asegurarse de que una solicitud HTTP realmente se envía a través de AJAX es utilizando la verificación de SESSION, envía session_id en un parámetro get y verifica esta sesión si está permitida o no.


Las variables en $_SERVER no son realmente parte de PHP, por lo que no las encontrará en la documentación de PHP. Están preparados por el servidor web que los transfiere al lenguaje de scripting.

Hasta donde yo sé, X-Requested-With es enviado por las funciones Ajax de la mayoría de los Frameworks principales pero no todos (Dojo, por ejemplo, lo agregó hace solo dos años: #5801 ). Como tal, y teniendo en cuenta los comentarios de @bobince, es seguro decir que generalmente no es un método 100% confiable para determinar si una solicitud es una solicitud de AJAX o no.

La única forma 100% segura es enviar una bandera predefinida (por ejemplo, una variable GET) junto con la solicitud y para la página de recepción para verificar la presencia de esa bandera.


También puedes culpar a algunos errores del navegador: mira esta pregunta y su solución para Firefox

Firefox no conserva encabezados personalizados durante el redireccionamiento de solicitudes Ajax: una solución ASP.NET MVC

IE también tiene un problema de almacenamiento en caché que es más grave que la detección del método de solicitud.

De todos modos, necesita agregar eliminadores de memoria caché para evitar el almacenamiento en caché, entonces, ¿por qué no usar otra marca para especificar la llamada ajax? O, mejor aún, puede usar una URL diferente como http://ajax.mysite.com/endpoint/sevice?params


no olvide que puede falsificar cualquier encabezado con cURL como tal

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


$_SERVER claves $_SERVER que comienzan con HTTP_ se generan a partir de encabezados de solicitud HTTP. En este caso, el encabezado X-Requested-With .


Aquí hay una función rápida con uso de ejemplo:

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''; }


$headers = apache_request_headers(); $is_ajax = (isset($headers[''X-Requested-With'']) && $headers[''X-Requested-With''] == ''XMLHttpRequest'');


echo $_SERVER[''HTTP_X_REQUESTED_WITH''];

¿Qué esperabas de ese código? Supongamos que lo ejecuta directamente desde el navegador, sin utilizar la solicitud AJAX. Entonces, ¿cómo es que se puede establecer este encabezado?

Bueno, la respuesta a la última pregunta sobre la vida, el universo y todo: ¡un sniffer HTTP ! Consígase uno y olvide imprimir la variable $ _SERVER.

Firebug tiene uno, o puede usar el proxy Fiddler HTTP o el plugin LiveHTTPHeaders Mozilla. Estoy aburrido de hacer enlaces pero es fácil de googlear.

Por lo tanto, con sniffer HTTP puede estar seguro de cualquier encabezado HTTP alguna vez.

Tenga en cuenta que no puede evitar ningún "acceso directo" mediante el uso de XHR, ya que cada solicitud HTTP a su servidor ya es "directa".