2009-09-08 39 views
9

我最近开始在PHP中大量使用AJAX支持的脚本,事实上,被AJAX调用访问的文件也可以直接使用,如何禁用?AJAX只能访问

回答

21

你不能可靠地防止这种情况发生。关键并不是认为有人直接将此文件作为安全问题进行访问 - 为此做好准备,您将处于更安全的地方。

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

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

然而,事情的事实是,HTTP头可以很容易地欺骗,并且不保证代码的一种手段。在我在一个繁忙的网站上测试后,我发现这些头文件实际上并不那么可靠。

+0

现货。或者,您可以传递一个参数(例如'?ajax'),但这更容易被欺骗。 –

0

没有办法直接禁止访问。由于查询总是可以根据您提出的任何标准进行匹配。

如果正在使用XMLHttpRequest来查询它增加了可以使用的东西等检测头的服务器:

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

使用会话的应用程序中。

编辑:

  1. 注册你的网站在一个会议上,我使用该UUID的。

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

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

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

+0

我的回答有什么问题? – Joerg

+0

我没有投票给你,但这仍然没有可靠的办法。实施可能相当方便,但也可能被欺骗。 – Boldewyn

6

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

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

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

+1

这是可能的,但不可靠。除此之外,所有有效的点 –

0

也许你应该使用一些XSS防御技术,比如传递一些安全密钥以及ajax请求。只给JavaScript的关键,使加载页面的异步查询。

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

在这种情况下,你会不会担心路过的人请求直接将文件,只要你保持安全的密钥,用木桩来调用的行动,做完整性检查。