如何保护json

时间:2013-02-11 22:49:28

标签: php json

所以我有一个主页面从JSON链接获取数据并根据该数据填充下拉列表。我的问题是,目前任何人都可以访问json打印到的URL,我想保护它,以便只有服务器和服务器上运行的页面才能访问JSON输出。

我正在考虑比较远程服务器变量,例如remote_addr和server_addr,但remote_addr是客户端IP而不是服务器。

这样做的好方法是什么?

由于

1 个答案:

答案 0 :(得分:1)

您引用的安全问题称为JSON hijacking,虽然某些浏览器现在包含features to mitigate the risk,但在其他浏览器中仍然存在问题。

幸运的是,有一个相当简单的解决方案。为了理解它,我们需要首先了解攻击是如何工作的 实际上,第三方站点无法通过XMLHTTPRequest简单地请求您的JSON文件并以正常方式解析它,因为这可以通过同源策略来防止。 因此,攻击者所做的是重新定义JavaScript中的对象setter函数,以将任何新对象的值返回给他自己的代码,然后创建一个引用您的JSON文件的新<script>标记。加载JSON后,浏览器将执行它,创建一个新对象,并将值返回给攻击者的对象设置器处理程序。攻击者现在拥有您的数据。

为了防止这种情况,您需要做的就是无法直接将JSON代码解析为JavaScript。如果这样做,你想让它抛出错误。
实现此目的的一种常见方法(由Google和Facebook等网站使用)是将代码添加到JSON文件的开头,这将创建无限循环,从而阻止解析器访问其余代码(并抛出JavaScript错误) )。

例如,Facebook的JSON响应以字符串for(;;);开头,而Google使用各种代码,例如while(1);throw(1); <don't be evil>(后者只是直接抛出错误,而不是而不是创建无限循环。)

然后,您还需要修改自己的JSON处理JavaScript,以便在解析之前去除这个问题。例如,您可以这样做:

function parseJSON(json) {
   json = json.replace("for(;;);", "");
   /* parse your JSON as usual */
}

这为您的脚本和JSON增加了一点点,但是可以有效防止JSON劫持。