Does $ _SERVER existe em PHP ou não?

Em toda a Internet, incluído até aqui no Depósito de pilha, as pessoas afirmam que uma boa maneira de verificar se uma solicitação é AJAX ou não é fazer o seguinte:

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

No entanto, não vejo $_SERVER['HTTP_X_REQUESTED_WITH'] na documentação oficial do PHP

E quando tento fazer o seguinte:

 echo $_SERVER['HTTP_X_REQUESTED_WITH']; 

Nada é emitido.

Estou fazendo algo errado? Porque eu realmente gostaria de poder usar $_SERVER['HTTP_X_REQUESTED_WITH'] se estiver disponível.

As variables ​​em $_SERVER não são realmente parte do PHP, e é por isso que você não as encontrará na documentação do PHP. Eles são preparados pelo servidor da Web que os transmite para a linguagem de script.

Tanto quanto eu sei, o X-Requested-With é enviado pelas funções do Ajax da maioria dos principais Frameworks, mas não de todos (Dojo, por exemplo, adicionou-o apenas dois anos atrás: # 5801 ). Como tal, e tendo em consideração os comentários @bobince ‘, é seguro dizer que geralmente não é um método 100% confiável para determinar se um pedido é um pedido AJAX ou não.

A única maneira 100% segura é enviar um sinalizador pré-definido (por exemplo, uma variável GET), juntamente com a solicitação e para a página de recebimento para verificar a presença dessa bandeira.

não se esqueça de que você pode facilmente falsificar qualquer header com o CURL assim

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

$_SERVER chaves $_SERVER que começam com HTTP_ são geradas a partir de headers de solicitação HTTP. Nesse caso, o header X-Requested-With .

Este header é uma padronização em progresso de todas as bibliotecas AJAX lá fora.

Não será documentado na documentação php por si, mas sim nas diferentes bibliotecas AJAX que definem este header. As bibliotecas comuns enviaram este header: jQuery, Mojo, Prototype, …

Geralmente, essa biblioteca definirá o header usando

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

Aqui está uma function rápida com uso de exemplo:

 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'; } 
 echo $_SERVER['HTTP_X_REQUESTED_WITH']; 

O que você esperava de tal código? Suponha que você esteja executando diretamente do navegador, não usando a solicitação AJAX. Então, como é que este header pode ser configurado?

Bem, a resposta para a questão final da vida, o universo e tudo – um sniffer HTTP ! Obtenha um e esqueça de imprimir $ _SERVER variável.

O Firebug possui um, ou você pode querer usar o proxy HTTP Fiddler ou o plugin Mozilla LiveHTTPHeaders. Estou entediado para fazer links, mas facilmente pesquisado.

Então, com HTTP sniffer, você pode ter certeza de qualquer header HTTP de sempre.

Observe que você não pode impedir qualquer “access direto” usando o XHR, pois cada solicitação HTTP para o seu servidor já está “direta”.

Você também pode culpar alguns insetos no navegador – veja esta questão e sua solução para o Firefox

O Firefox não preserva headers personalizados durante o redirecionamento de solicitação do Ajax: uma solução ASP.NET MVC

IE também tem problema de cache que é mais grave, em seguida, detecção do método de solicitação.

De qualquer forma, você precisa adicionar busters de cache para evitar o armazenamento em cache, então porque não usar outra bandeira para especificar a binding ajax – ou melhor, você pode usar diferentes URL como http://ajax.mysite.com/endpoint/sevice?params

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

A melhor solução para se certificar se uma solicitação HTTP é realmente enviada via AJAX está usando a verificação SESSION, você envia session_id em um parâmetro get e você verifica esta session se for permitido ou não!

Eu concordo com Pekka. Não há um método nativo confiável entre o lado da frente e o lado traseiro que pode detectar automaticamente se um cliente realmente está chamando um ponto final usando o AJAX.

Para meu próprio uso, tenho algumas maneiras principais de verificar se um cliente está solicitando um dos meus pontos de extremidade:

  1. Eu posso usar HTTP_X_REQUESTED_WITH quando não estiver no contexto de domínio cruzado.

  2. Em vez de verificar “X-requested-with”, estou checando $ _SERVER [‘HTTP_ORIGIN’] (que é enviado da solicitação AJAX) com a intenção de gerenciar permissions de domínio cruzado. A maior parte do tempo, a principal razão pela qual eu estou verificando se uma solicitação é uma solicitação AJAX, é especialmente por causa de permissions de domínio cruzado, usando este código PHP: header (‘Access-Control-Allow-Origin:’. $ _ SERVER [‘ HTTP_ORIGIN ‘]); // Se esta “HTTP_ORIGIN” estiver na minha lista branca

  3. minhas API esperam do cliente explicitar, em alguns casos, o tipo de dados (JSON, HTML, etc.) em um GET ou um POST var. Por exemplo, eu verifico se $ _REQUEST [‘ajax’] não está vazio ou é igual a um valor esperado.