1

So I have a main page that gets data from a JSON link and populates a dropdown based on that data. My question is, currently anyone can access the URL where the json is getting printed to and I want to secure it so that only the server and the pages running on the server can access the JSON output.

I was thinking of comparing PHP server vars such as remote_addr and server_addr but the remote_addr is the clients IP and not the server.

What is a good way to go about doing this?

Thanks

4

1 回答 1

1

您提到的安全问题称为JSON 劫持,虽然现在一些浏览器包含降低风险的功能,但在其他浏览器中仍然是一个问题。

幸运的是,有一个相当简单的解决方案。要理解它,我们首先需要了解攻击是如何工作的。
第三方站点实际上不可能简单地通过 XMLHTTPRequest 请求您的 JSON 文件并以正常方式解析它,因为同源策略会阻止这种情况。
因此,攻击者所做的就是在 JavaScript 中重新定义对象设置器函数,以将任何新对象的值返回到他自己的代码中,然后创建一个<script>引用您的 JSON 文件的新标签。加载 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 劫持。

于 2013-02-12T02:07:43.780 回答