2013-02-11 130 views
1

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

我在考虑比较remote_addr和server_addr等PHP服务器变量,但remote_addr是客户端IP而不是服务器。

这样做的好方法是什么?

感谢

+3

总之:不可能。 – Jon 2013-02-11 22:51:34

+1

您如何验证/授权用户?如果有一个认证cookie,我想这个cookie会包含在AJAX请求中,对吗?你会基于此来验证。 – David 2013-02-11 22:52:11

+1

请勿公开您的API。忘记用PHP代码做这件事吧;在防火墙/ DNS /基础设施级别保持端口和路由关闭。 – 2013-02-11 22:53:35

回答

1

你提到的安全问题被称为JSON hijacking,而和一些浏览器现在包含features to mitigate the risk,它仍然是在其他浏览器的问题。

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

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

例如,Facebook的JSON响应以字符串for(;;);开始,而谷歌使用的代码,例如while(1);,和throw(1); <don't be evil>各种位(后者简单地直接将引发错误,而不是创建无限循环)。

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

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

这增加了克鲁夫特,以你的脚本和你的JSON的一点点,但在防止JSON劫持有效。