代码之家  ›  专栏  ›  技术社区  ›  syaz

阻止直接访问PHP页

  •  16
  • syaz  · 技术社区  · 16 年前

    如何防止用户直接访问仅用于Ajax调用的页面?

    在Ajax调用期间传递密钥似乎是一种解决方案,而不使用密钥的访问将不会被处理。但制作钥匙也很容易,不是吗?诅咒视图源…

    P/S:使用Apache作为Web服务器。

    编辑:为了回答为什么,我在index.php中有jquery ui选项卡,在这些选项卡中有带有脚本的表单,如果直接访问这些表单,它们将不起作用。我不知道为什么用户会想这样做,我只是想通过阻止直接访问不带验证脚本的表单来提高用户友好性。

    10 回复  |  直到 11 年前
        1
  •  21
  •   Eran Galperin    16 年前

    正如其他人所说,可以通过创建适当的头来模拟Ajax请求。 如果要进行基本检查以查看请求是否为Ajax请求,可以使用:

     if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
         //Request identified as ajax request
     }
    

    但是,您不应该将您的安全性建立在这张支票的基础上。如果您需要的话,它将消除对页面的直接访问。

        2
  •  34
  •   Paige Ruten    16 年前

    无法保证他们通过Ajax访问它。直接访问和Ajax访问都来自客户端,因此很容易被伪造。

    你为什么要这样做?

    如果是因为PHP代码不太安全,那么就让PHP代码更安全。(例如,如果您的Ajax将用户ID传递给php文件,请在php文件中编写代码以确保这是正确的用户ID。)

        3
  •  8
  •   Draemon    16 年前

    听起来你可能是走错了方向。Ajax调用就像一个标准的页面请求,只有按照约定,响应才不会显示给用户。

    但是,它仍然是一个客户机请求,因此您必须为客户机能够看到响应感到高兴。以这种方式使用“键”模糊访问只会使事情复杂化。

    事实上,我会说视点源的“诅咒”是通过默默无闻打击安全的一个小武器。

    那么你为什么要这么做呢?

        4
  •  4
  •   Cristian Vat    16 年前

    如果浏览器通过普通请求或Ajax调用您的页面,那么有人可以手动调用它。就服务器客户机通信而言,正常请求和Ajax请求之间确实没有明确的区别。

    常见的情况是向服务器传递一个标题,上面写着“这个请求是由Ajax完成的”。如果您使用的是原型,它会自动将HTTP头“x-requested-with”设置为“xmlhttprequest”,以及其他一些头(包括原型版本)。(参见 http://www.prototypejs.org/api/ajax/options 在“请求标题”处)

    附加:如果您正在使用另一个Ajax库,您可能可以添加自己的头。这对于了解服务器端的请求类型以及避免在浏览器中请求Ajax页面时出现简单情况非常有用。它不能保护你的请求不受任何人的影响,因为你不能。

        5
  •  1
  •   Kzqai    15 年前

    cookies不安全…试试美元课程。这几乎是你可以依靠的少数几个不被欺骗的跨页面的事情之一。因为,当然,它基本上永远不会离开你的控制。

        6
  •  1
  •   foxybagga    14 年前

    谢谢,尽管我用

    define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
    
    if(IS_AJAX) {
        //Request identified as ajax request
    }
    

    干杯!

        7
  •  0
  •   Eric Tuttleman    16 年前

    对此不确定,但可能要检查引用头?我认为如果有人手动输入你的URL,它就不会有一个引用头,而Ajax调用会(至少在我刚刚在系统上做的快速测试中)。

    不过,这是一种糟糕的检查方式。由于很多原因,推荐人可以是空白的。您是否试图阻止人们将您的Web服务用作公共服务或其他服务?

    在阅读了编辑注释之后,如果表单将通过Ajax调用加载,那么您可以检查window.location以查看该URL是否是Ajax表单的URL。如果是,请通过document.location转到右侧页面

        8
  •  0
  •   Kelly    15 年前

    这对确保安全肯定没用。但是我认为,如果您想说一个php页面,它生成了一个完整的页面,如果该页面不是Ajax请求的,而是在使用Ajax时只生成您需要返回的部分,那么这可能是有用的。这将使您的站点不适合Ajax,因此如果说他们单击了一个链接,并且应该加载一个注释框,但是他们没有Ajax,那么它仍然会将它们发送到显示注释的整个页面,然后生成该页面。

        9
  •  0
  •   Antony Carthy    15 年前

    通过index.php传递您的直接请求,通过ajax.php传递您的ajax请求,然后不要让用户直接浏览到任何其他源文件-确保index.php和ajax.php具有包含所需代码的适当逻辑。

        10
  •  0
  •   Jeroenv3    11 年前

    在调用脚本的javascript文件中:

    var url = "http://website.com/ajax.php?say=hello+world";
    xmlHttp.open("GET", url, true);
    xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
    

    然后在php文件ajax.php中:

    if($_SERVER['HTTP_X_REQUESTED_WITH'] != "XMLHttpRequest") {
        header("Location: http://website.com");
        die();
    }
    

    极客仍然可以通过伪造头部来调用ajax.php脚本,但是我的脚本的其余部分需要会话,因此在没有检测到有效会话时执行将结束。我需要这样做才能将具有过期的hybridauth会话的人重定向到主站点,以便再次登录,因为他们最终被重定向到Ajax脚本。