所以我有一个主页面从JSON链接获取数据并根据该数据填充下拉列表。我的问题是,目前任何人都可以访问json打印到的URL,我想保护它,以便只有服务器和服务器上运行的页面才能访问JSON输出。
我正在考虑比较远程服务器变量,例如remote_addr和server_addr,但remote_addr是客户端IP而不是服务器。
这样做的好方法是什么?
由于
答案 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劫持。