PHP中是否存在$ _SERVER ['HTTP_X_REQUESTED_WITH']?

Han*_*ank 68 php ajax http-headers

在整个互联网上,甚至包括在Stack Overflow中,人们声称检查请求是否是AJAX的好方法是执行以下操作:

if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) {...}
Run Code Online (Sandbox Code Playgroud)

但是,我没有$_SERVER['HTTP_X_REQUESTED_WITH']官方PHP文档中看到

当我尝试执行以下操作时:

echo $_SERVER['HTTP_X_REQUESTED_WITH'];
Run Code Online (Sandbox Code Playgroud)

什么都没输出.

难道我做错了什么?因为我真的希望能够使用$_SERVER['HTTP_X_REQUESTED_WITH']它是否可用.

Pek*_*ica 61

变量$_SERVER并不是PHP的一部分,这就是为什么你不会在PHP文档中找到它们.它们由Web服务器准备,Web服务器将它们传递给脚本语言.

据我所知,它X-Requested-With是由大多数主要框架的Ajax函数发送的,但不是全部(例如,Dojo,仅在两年前添加它:#5801).因此,考虑到@bobince的注释,可以肯定地说,确定请求是否是AJAX请求通常不是100%可靠的方法.

唯一100%安全的方法是发送预定义标志(例如GET变量)以及请求和接收页面以检查是否存在该标志.

  • 我认为这也不是一种可靠的方法.防火墙/代理工具可能会使用它,如果您没有将此标头的使用与响应中的"Vary:X-Requested-With"结合使用,您可能会向代理用户返回错误的响应...在IE中缓存.很多人确实使用了"X-Requested-With",但我认为这是一个糟糕的主意.最好在查询参数中传递一个标志,以表示您需要XMLHttp样式(或JSON)响应. (4认同)
  • Dojo不是_framework_ !! 这是一个图书馆.jQuery也是**库**.不幸的是,"框架"这个词演变成了一个经常被错误使用的流行语. (4认同)

J. *_*son 27

不要忘记你可以轻易地用cURL欺骗任何标题

curl_setopt($ch,CURLOPT_HTTPHEADER,array("X-Requested-With : XMLHttpRequest"));
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 17

$_SERVERHTTP_从HTTP请求标头生成的密钥.在这种情况下,X-Requested-With标题.

  • @Hank将XHR与"正常"请求分开,绝对是根本无用的安全措施,因为每个人都可以毫无问题地模拟XHRequest.您需要使用可靠的身份验证措施(或您已有的主应用程序的其他任何内容)保护您的Ajax脚本. (9认同)

Jer*_*NER 14

此标头是所有AJAX库中的标准化进程.

它不会在php文档中记录,而是在设置此标头的不同AJAX库中记录.公共库确实发送了这个头:jQuery,Mojo,Prototype,...

通常这些库将使用标头设置

xhrobj.setRequestHeader("X-Requested-With", "XMLHttpRequest");
Run Code Online (Sandbox Code Playgroud)


tfo*_*ont 5

这是一个带有示例用法的快速函数:

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';
}
Run Code Online (Sandbox Code Playgroud)

  • 这并不能回答任何问题。OP 询问的正是这样的代码片段。她/他想知道为什么它有效,即这个“$_SERVER['HTTP_X_REQUESTED_WITH']”来自哪里,它在哪里设置,以及我们是否/为什么可以真正依赖它。 (2认同)