AJAX只能访问

时间:2009-09-08 13:04:15

标签: php jquery ajax

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

5 个答案:

答案 0 :(得分:22)

您无法可靠地防止这种情况发生。关键是不要考虑有人直接访问这个文件作为安全问题 - 计划这样做是可能的,你将在一个更安全的地方。

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

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

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

答案 1 :(得分:6)

正如其他人在回复中所说,这是不可能的。这是因为计算机安全的一个支柱原则:你永远不能相信客户。这就是我们验证客户端等所有输入的原因。

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

哦,网络服务是开放的这一事实是一件好事!您正在为用户提供开放式API,这非常简洁!也许不是试图锁定你的社区而是接受它 - 给他们一些关于如何与你的服务接口的文档,他们会创造更多的客户。而不是你购买iPhone SDK和花时间学习Objective C,你的一个用户可能会。

答案 2 :(得分:0)

没有办法直接禁止访问。由于可以随时制作查询以匹配您提出的任何条件。

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

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:-1)

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

编辑:

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

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

  3. 使用包含此值的参数发送您的AJAX请求。

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