Php 仅AJAX访问

Php 仅AJAX访问,php,jquery,ajax,Php,Jquery,Ajax,我最近开始用PHP编写大量支持AJAX的脚本,事实是,AJAX调用访问的文件也可以直接使用,如何禁用它?您无法可靠地防止这种情况发生。真正的关键是不要考虑有人直接访问这个文件作为一个安全问题-这个计划是可能的,你将在一个更安全的地方。 有些人可能会推荐这样(或类似)的代码: 然而,事实是HTTP头很容易被欺骗,并且不是保护代码的一种手段。不久前我在一个繁忙的站点上进行测试时,我注意到这些头文件实际上并不那么可靠。没有办法直接禁止访问。因为查询总是可以精心编制以匹配您提出的任何条件 如果使用Xml

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

您无法可靠地防止这种情况发生。真正的关键是不要考虑有人直接访问这个文件作为一个安全问题-这个计划是可能的,你将在一个更安全的地方。 有些人可能会推荐这样(或类似)的代码:


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

没有办法直接禁止访问。因为查询总是可以精心编制以匹配您提出的任何条件

如果使用XmlHttpRequest查询服务器,它会添加一个标头,该标头可以使用以下方法检测:

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

在应用程序中使用会话

编辑:

  • 在会话中注册站点,我使用UUID

  • 设置与会话中使用的值相同的cookie

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

  • 比较会话、cookie和参数中的值


  • 正如其他人在答复中所建议的那样,这是不可能的。这是因为计算机安全的一个基本原则:你永远不能信任客户。这就是为什么我们要验证来自客户端的所有输入,等等

    与其试图阻止其他客户端访问您的服务,不如花时间编写防御性web服务。也就是说,确保恶意用户不会在您的业务逻辑中漏掉注入或其他攻击。例如,确保所有电子邮件都是有效的,人们购买物品的价格不是负美元,等等


    哦,事实上web服务是开放的是一件好事!您为您的用户提供了一个开放的API,这非常整洁!也许你不再试图封锁你的社区,而是拥抱它——给他们一些关于如何与你的服务交互的文档,这样他们就会有更多的客户。与其购买iPhone SDK并花时间学习Objective C,不如让您的一位用户学习。

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

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

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

    这是可能的,但不可靠。除此之外,所有有效点都将打开。或者,您可以传递一个参数(例如,
    ?ajax
    ),但这更容易欺骗。我没有投票否决您,但这仍然不是一个可靠的方法。它可能很容易实现,但也可能被欺骗。
    <script type="text/javascript">
        window.csrf_key = '<?php $user->getCsrf(); ?>';
    </script>