【发布时间】:2010-11-26 12:08:38
【问题描述】:
我最近开始在 PHP 中编写大量支持 AJAX 的脚本,问题是,被 AJAX 调用访问的文件也可以直接使用,如何禁用它?
【问题讨论】:
我最近开始在 PHP 中编写大量支持 AJAX 的脚本,问题是,被 AJAX 调用访问的文件也可以直接使用,如何禁用它?
【问题讨论】:
您无法可靠地防止这种情况发生。真正的关键是不要将直接访问此文件的人视为安全问题 - 为这可能做好计划,您将处于更安全的地方。
有些人可能会推荐看起来像这样(或类似)的代码:
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH'])
&& strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
// more code here
}
然而,事实上,HTTP 标头很容易被欺骗,并且不是保护代码的方法。不久前在一个繁忙的网站上进行测试时,我注意到这些标头实际上并不那么可靠。
【讨论】:
?ajax),但这更容易被欺骗。
也许您应该使用一些 XSS 防御技术,例如在 ajax 请求中传递一些安全密钥。并且只提供与加载页面一起进行异步查询的 javascript 的密钥。
<script type="text/javascript">
window.csrf_key = '<?php $user->getCsrf(); ?>';
</script>
在这种情况下,您不必担心人们直接将请求传递给文件,只要您确保密钥安全,使用 POST 调用操作并进行完整性检查。
【讨论】:
在您的应用程序中使用会话。
编辑:
在会话中注册您的站点,我为此使用 UUID。
设置一个与会话中使用的值相同的 cookie。
发送带有参数的 AJAX 请求,该参数也包含此值。
比较会话、cookie 和参数中的值。
【讨论】:
正如其他人在回复中所建议的那样,这是不可能的。这是因为计算机安全的支柱原则之一:您永远不能信任客户端。这就是我们验证来自客户端等的所有输入的原因。
与其试图阻止其他客户端访问您的服务,不如花时间编写防御性 Web 服务。这意味着,确保恶意用户无法通过您的业务逻辑进行注入或其他攻击。例如,确保所有电子邮件都是有效的,人们不会以负值购买商品,等等。
哦,Web 服务是开放的这一事实是一件好事!您正在为您的用户提供一个开放的 API,这非常简洁!也许与其试图锁定你的社区,不如拥抱它——给他们一些关于如何与你的服务交互的文档,他们会吸引更多的客户。您的一位用户可能不会购买 iPhone SDK 并花时间学习 Objective C。
【讨论】:
没有办法直接禁止访问。因为始终可以精心设计查询以匹配您提出的任何条件。
如果 XmlHttpRequest 被用于查询服务器,它会添加一个标头,可以使用以下内容进行检测:
/* AJAX check */
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
//Do something here
}
【讨论】: