所以我有一个主页从JSON链接获取数据并根据这些数据填充下拉菜单。我的问题是,目前任何人都可以访问json打印到的URL,并且我想要保护它,以便只有服务器和服务器上运行的页面才能访问JSON输出。如何保护json
我在考虑比较remote_addr和server_addr等PHP服务器变量,但remote_addr是客户端IP而不是服务器。
这样做的好方法是什么?
感谢
所以我有一个主页从JSON链接获取数据并根据这些数据填充下拉菜单。我的问题是,目前任何人都可以访问json打印到的URL,并且我想要保护它,以便只有服务器和服务器上运行的页面才能访问JSON输出。如何保护json
我在考虑比较remote_addr和server_addr等PHP服务器变量,但remote_addr是客户端IP而不是服务器。
这样做的好方法是什么?
感谢
你提到的安全问题被称为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劫持有效。
总之:不可能。 – Jon 2013-02-11 22:51:34
您如何验证/授权用户?如果有一个认证cookie,我想这个cookie会包含在AJAX请求中,对吗?你会基于此来验证。 – David 2013-02-11 22:52:11
请勿公开您的API。忘记用PHP代码做这件事吧;在防火墙/ DNS /基础设施级别保持端口和路由关闭。 – 2013-02-11 22:53:35