【问题标题】:How to set php file to only serve for AJAX? [duplicate]如何将 php 文件设置为只为 AJAX 服务? [复制]
【发布时间】:2013-06-19 22:59:46
【问题描述】:

我有一个在很多地方都使用 AJAX 调用的网站, 他们都调用一个文件,称为ajax_agent.php 并使用 GET 变量,例如 ajax_agent.php?action=x&arg1=y&etc=true

但讨厌的用户可以直接使用自定义变量访问 ajax_agent.php。它使用准备好的 PDO 语句,所以我猜没有 sql 注入的危险,但它仍然可以揭示它不应该的东西。

那么有什么方法可以检测客户端是另一个 php 页面(AJAX 处理它)还是实际的浏览器窗口?这样它就会die('you don't have permission to see this page.'); ?

谢谢!

【问题讨论】:

  • 使用会话设置用户有权访问的权限
  • 请记住,javascript 是一种客户端执行语言。如果 javascript 可以访问资源,那么用户也可以
  • @Musa 好的,但在这种情况下,我不希望任何“用户”浏览该页面。如果它是 AJAX 调用,它应该只回显某些内容。
  • @compid 似乎是合法的。所以,没办法?
  • @Musa — 会话不会在 Ajax 请求和地址栏请求或链接查看源请求之间更改。

标签: php ajax jquery


【解决方案1】:

AJAX 请求与其他请求一样是 HTTP 请求。请求的任何部分都可能被攻击者操纵。您不能信任它的任何部分,因此检测它是来自浏览器的 Ajax 请求而不是通过浏览器操纵的请求是不可靠的。

如果您真的想保护您的数据,请强制用户登录并使用会话来强制执行。

【讨论】:

  • 强制用户登录不会阻止他们查看原始数据。它只是阻止匿名用户看到它。 (如果不让用户直接访问,就无法将数据提供给浏览器)
  • 同意,但如果 PHP 脚本拒绝处理来自未登录用户的任何请求,则不会泄露给匿名用户。我假设登录系统以某种方式被调节以限制对受信任用户的访问。
  • 是的,这是个好主意。但就我而言,我不想实现登录系统。无论如何谢谢:)
【解决方案2】:

您可以尝试使用HTTP_X_REQUESTED_WITH 标头。不过,这取决于您的 javascript(库)是否正确发送了此标头:

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  // do AJAX only stuff
}

来源:http://davidwalsh.name/detect-ajax

编辑:请注意,正如我在问题 cmets 中所说,如果可以使用 javascript 发出请求,那么它可以由人类发出。没有办法阻止这种情况。这个答案只是提供了一种过滤掉直接访问该页面的普通用户的方法。

【讨论】:

  • PHP 配置在很大程度上无关紧要。这取决于告诉客户端发出请求以设置标头的 JavaScript。没有什么能阻止用户自己设置。
  • 这是 Zend 框架用来检测 Ajax 请求的上下文切换器。
  • 谢谢!有空时我会接受你的回答。
  • @Orangepill — 系统可以提供适当的数据表示。它对安全不起作用。
  • @Quentin 谢谢,我已经编辑了答案
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 2014-11-24
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 2010-12-28
  • 1970-01-01
相关资源
最近更新 更多