阻止对PHP的非AJAX请求

阻止对PHP的非AJAX请求,php,ajax,Php,Ajax,可能重复: 我正在创建一个依赖于对PHP页面的AJAX调用的站点。有没有办法阻止访问原始数据?(即通过他们自己的post请求访问php文件) 我想最好的方法(如果可能的话)是防止PHP将数据发送到任何不是来自AJAX的东西(因为它必须来自同一个域)。有什么建议吗?当请求没有正确的GET或POST变量时,您不能返回任何内容 话虽如此,说实话,这没什么好担心的,因为任何浏览你发送ajax请求的页面的人都可能试图做一些恶意的事情,而他们接收通过ajax发送的内容并不会给他们带来任何好处。没有普通用户

可能重复:

我正在创建一个依赖于对PHP页面的AJAX调用的站点。有没有办法阻止访问原始数据?(即通过他们自己的post请求访问php文件)


我想最好的方法(如果可能的话)是防止PHP将数据发送到任何不是来自AJAX的东西(因为它必须来自同一个域)。有什么建议吗?

当请求没有正确的GET或POST变量时,您不能返回任何内容

话虽如此,说实话,这没什么好担心的,因为任何浏览你发送ajax请求的页面的人都可能试图做一些恶意的事情,而他们接收通过ajax发送的内容并不会给他们带来任何好处。没有普通用户查看每个源

if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
     //allow access
}
else
   die("Direct access restricted");

虽然Ajax库在它们的请求中添加了一个
X-request-With:XmlHttpRequest
头,但它是可以作弊的,因此您可以测试它的存在性:

if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XmlHttpRequest')) {
    // not an ajax request
}

但是,恶意用户也可以轻松发送此头,因此不要使用此头来保护敏感数据。

正如@Evan在其评论中链接的那样,您可以通过在
$\u服务器中查找
HTTP\u X\u REQUESTED\u来检测XmlHttpRequest请求。但该值来自客户端发送的头。但是,与来自用户的任何信息一样,这可能是伪造的


实际上,没有办法以实用的方式阻止非XmlHttpRequest。如果阻止API真的很重要,那么可以在请求主页时向Javascript发出唯一键(并将其存储在会话中)。它在XmlHttpRequest中传递,当该页面看到它并验证它时,它提供访问权限。但是,即使是唯一的密钥也可以从页面中删除。

请注意,这种方法不是100%保存的。HTTP头(如HTTP_X_请求的_)很容易被欺骗。还有,以前有人问过这个问题:@Luwe:这个问题和这个问题有什么共同点?@Evan:但是,这并不能起到“预防”的作用。即使是一个不太坚定的入侵者,它也很容易伪造。我可以想象使用的其他一切都是如此——如果你提供的Javascript告诉浏览器如何请求数据,那么看到Javascript的每个人都可以自己做同样的事情。你的PHP后端到基于web的表示层。如果用户可以手动访问API是一个问题,那么API就坏了。否则,这不是问题,你可以继续做一些有建设性的工作。我不担心临时/普通用户。这些数据本身就很有价值,所以我尝试在不免费提供的情况下传输它。有没有一个选项是不“可欺骗的”?或者,如果我需要保护数据,我可能需要找到一种不同的解决方案?我曾经想到过类似的方法,但正如您所指出的,这并没有增加多少安全性。我要找的可能不可能。