Ajax 的跨域限制 - JSON

Posted

技术标签:

【中文标题】Ajax 的跨域限制 - JSON【英文标题】:Cross Domain Limitations With Ajax - JSON 【发布时间】:2011-01-02 17:11:47 【问题描述】:

使用 ajax 请求 (ht|x)ml 时,您只能将请求发送到同一个域。但是,如果您请求 JSON,您可以将其发送到任何域。为什么?

有人告诉我这是出于安全考虑,但为什么网站会通过 ajax 而不是直接做一些恶意的事情,如果这是有道理的话。

【问题讨论】:

因为在 ajax 的情况下,客户端计算机发出呼叫,所以我可以在网络上对特定网站进行 1000 台不同的计算机攻击(或者做其他事情,挖掘我的网站,投票给我为我们担任总统)。而且它无法追踪或停止,因为它的行为就像 10000 个不同的人。 【参考方案1】:

以下是为什么有人会破解 AJAX 请求的示例。

https://blog.codinghorror.com/preventing-csrf-and-xsrf-attacks/

http://directwebremoting.org/blog/joe/2007/04/04/how_to_protect_a_json_or_javascript_service.html

【讨论】:

【参考方案2】:

直接在您的页面中注入 JSON 根本不安全。

您向加载的脚本提供对页面中资源(数据、cookie、逻辑)的完全访问权限。

如果注入的代码是恶意的,它可以在您的服务器上运行操作,将数据回发到他们的服务器(允许跨域发布,而不是响应,但您的数据无论如何都会发送)等等......

我们正在构建一个大量使用跨域访问的网络应用。 为了解决这个问题,我们提供了一个相当简单的JSONP sandboxing 解决方案。

【讨论】:

【参考方案3】:

之所以称为JSONP,实际上与JSON 本身没什么关系。做一个跨域的ajax请求就像在你的HTML网页中添加<script src="http://url.com/data.js></script>标签一样简单;这是 JSONP 和跨域 ajax 的基本概念。

发生的情况是 data.js 文件由 JavaScript 解释。这使我们能够从 data.js 文件(位于另一个域中)中获取数据,例如它加载了当前范围内可用的函数。

【讨论】:

【参考方案4】:

看看这个wikipedia article。

JSON 之所以“安全”是因为您必须通过回调传递它。远程站点将运行返回 JSON,您的 javascript 库不仅会盲目运行它,还会尝试将其传递给您指定的函数,例如 jsonpCallback( response )。由于您没有直接运行远程代码,因此您可以控制更多内容,并且一切都很好。

【讨论】:

浏览器在 JSON 进入您的回调函数之前运行评估。这个经过评估的代码甚至可以在调用之前重写你的回调函数。 我不对 JSON 响应运行 eval,我使用解析器。 您没有选择权,浏览器将解释 JSON 字符串响应并将其转换为对象,然后再进入您的函数。所以根本不安全。

以上是关于Ajax 的跨域限制 - JSON的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET网站中实现Ajax的跨域请求

AJAX的跨域与JSONP

ajax 跨域请求

跨域:跨域及解决方法

Ajax中的跨域请求(跨源请求)

Ajax请求的跨域(CORS)问题