【问题标题】:AJAX only access仅 AJAX 访问
【发布时间】:2010-11-26 12:08:38
【问题描述】:

我最近开始在 PHP 中编写大量支持 AJAX 的脚本,问题是,被 AJAX 调用访问的文件也可以直接使用,如何禁用它?

【问题讨论】:

    标签: php jquery ajax


    【解决方案1】:

    您无法可靠地防止这种情况发生。真正的关键是不要将直接访问此文件的人视为安全问题 - 为这可能做好计划,您将处于更安全的地方。

    有些人可能会推荐看起来像这样(或类似)的代码:

    if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) 
         && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
        // more code here
    }
    

    然而,事实上,HTTP 标头很容易被欺骗,并且不是保护代码的方法。不久前在一个繁忙的网站上进行测试时,我注意到这些标头实际上并不那么可靠。

    【讨论】:

    • 正确。或者,您可以传递一个参数(例如?ajax),但这更容易被欺骗。
    【解决方案2】:

    也许您应该使用一些 XSS 防御技术,例如在 ajax 请求中传递一些安全密钥。并且只提供与加载页面一起进行异步查询的 javascript 的密钥。

    <script type="text/javascript">
        window.csrf_key = '<?php $user->getCsrf(); ?>';
    </script>
    

    在这种情况下,您不必担心人们直接将请求传递给文件,只要您确保密钥安全,使用 POST 调用操作并进行完整性检查。

    【讨论】:

      【解决方案3】:

      在您的应用程序中使用会话。

      编辑:

      1. 在会话中注册您的站点,我为此使用 UUID。

      2. 设置一个与会话中使用的值相同的 cookie。

      3. 发送带有参数的 AJAX 请求,该参数也包含此值。

      4. 比较会话、cookie 和参数中的值。

      【讨论】:

      • 我没有投票给你,但这仍然不是可靠的方法。实现起来可能很方便,但也可能被欺骗。
      【解决方案4】:

      正如其他人在回复中所建议的那样,这是不可能的。这是因为计算机安全的支柱原则之一:您永远不能信任客户端。这就是我们验证来自客户端等的所有输入的原因。

      与其试图阻止其他客户端访问您的服务,不如花时间编写防御性 Web 服务。这意味着,确保恶意用户无法通过您的业务逻辑进行注入或其他攻击。例如,确保所有电子邮件都是有效的,人们不会以负值购买商品,等等。

      哦,Web 服务是开放的这一事实是一件好事!您正在为您的用户提供一个开放的 API,这非常简洁!也许与其试图锁定你的社区,不如拥抱它——给他们一些关于如何与你的服务交互的文档,他们会吸引更多的客户。您的一位用户可能不会购买 iPhone SDK 并花时间学习 Objective C。

      【讨论】:

      • 有可能,但不可靠。除此之外,所有有效积分
      【解决方案5】:

      没有办法直接禁止访问。因为始终可以精心设计查询以匹配您提出的任何条件。

      如果 XmlHttpRequest 被用于查询服务器,它会添加一个标头,可以使用以下内容进行检测:

      /* AJAX check  */
      if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
        //Do something here
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-27
        • 2013-01-26
        • 2023-04-02
        • 1970-01-01
        • 2019-07-18
        • 1970-01-01
        • 2012-05-27
        • 2012-12-20
        相关资源
        最近更新 更多