【问题标题】:Blocking non-AJAX requests to PHP [duplicate]阻止对 PHP 的非 AJAX 请求 [重复]
【发布时间】:2011-10-30 23:00:06
【问题描述】:

可能重复:
Prevent Direct Access To File Called By ajax Function

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

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

【问题讨论】:

  • 请注意,此方法并非 100% 保存。像 HTTP_X_REQUESTED_WITH 这样的 HTTP 标头可以很容易地被欺骗。另外,之前有人问过这个问题:stackoverflow.com/questions/1756591/…
  • @Luwe:这个问题和这个问题有什么共同点?
  • @Evan:但是,这并没有起到太多的“预防”作用。即使是一个不太坚定的入侵者,它也很容易伪造。我能想象到的所有其他东西也是如此——如果你提供的 Javascript 告诉浏览器如何请求数据,那么每个看到 Javascript 的人都可以自己做同样的事情。
  • 您的 PHP 后端 should be an API 到基于 Web 的表示层。如果用户可以手动访问 API 存在问题,则 API 已损坏。否则,这不是问题,您可以继续进行一些建设性的工作。

标签: php ajax


【解决方案1】:
if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
     //allow access
}
else
   die("Direct access restricted");

虽然可以作弊

【讨论】:

  • 有没有“不可作弊”的选项?或者,如果我需要保护数据,也许我需要找到不同的解决方案?
【解决方案2】:

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

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

【讨论】:

  • 我不担心临时/普通用户。数据本身就很有价值,所以我试图在不免费赠送的情况下传输它。
【解决方案3】:

Ajax 库在其请求中添加 X-Requested-With: XmlHttpRequest 标头,因此您可以测试其是否存在:

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

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

【讨论】:

    【解决方案4】:

    正如@Evan 在他的评论中链接的那样,您可以通过在$_SERVER 中查找HTTP_X_REQUESTED_WITH 来检测XmlHttpRequest 请求。但是该值来自客户端发送的标头。但是,与来自用户的任何信息一样,这可能会被欺骗。

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

    【讨论】:

    • 我曾想过类似的事情,但正如您所指出的,这并没有增加太多的安全性。我正在寻找的可能是不可能的。
    猜你喜欢
    • 2021-11-14
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 2019-12-04
    相关资源
    最近更新 更多