【发布时间】:2011-11-03 06:32:11
【问题描述】:
是否可以从具有不同域源的 iframe 内部进行 AJAX 调用?
我尝试过脚本注入,但它不起作用,因为 iframe 的源代码是安全的。 我在加州 DMV 网站 here 做了一个简单的摆弄。
我收到 DOM 异常 8 错误。是安全问题吗?
【问题讨论】:
标签: javascript html dom iframe
是否可以从具有不同域源的 iframe 内部进行 AJAX 调用?
我尝试过脚本注入,但它不起作用,因为 iframe 的源代码是安全的。 我在加州 DMV 网站 here 做了一个简单的摆弄。
我收到 DOM 异常 8 错误。是安全问题吗?
【问题讨论】:
标签: javascript html dom iframe
无法在具有不同域源的 iframe 中修改或进行 JS 调用。出于安全原因,这在所有浏览器中都受到限制。
请参阅“Same Origin Policy”了解帧间安全性的工作原理。简而言之,出于安全原因,不同域上的帧之间允许的通信非常少。您不能在不同域的框架之间进行任何直接的 Javascript 调用。
有一种方法可以进行跨域 ajax 调用,它涉及使用JSONP。基本上,您将一个脚本标签注入到您自己的框架中,并且该脚本标签指向网络上任何地方的服务器端点。由于脚本标签的 src 值不受同源策略的限制,因此您可以访问该服务器。但是,现在您需要有一种方法来恢复该结果。这是使用 JSONP 完成的,您在服务器请求中指定您希望返回的 javascript 调用的 javascript 函数。返回的 javascript 中可以包含 javascript 数据,然后将其传递给所需的函数。 JSONP 需要客户端代码和服务器代码之间的合作,因为普通的 ajax 调用可能不支持 JSONP 的额外部分。但是,通过双方的合作,您可以绕过支持 JSONP 的服务器端点的同源策略。
HTML5 有一个新的消息传递系统,可以在不同域的协作框架之间安全地传递数据(而不是直接的 JS 调用)。请参阅 here 和 here 了解 HTML5 消息传递的工作原理。
【讨论】:
是的,这是一个安全问题,因为大多数浏览器都执行同源策略:http://en.wikipedia.org/wiki/Same_origin_policy。
您可以查看专门为解决此问题而设计的 JSONP http://niryariv.wordpress.com/2009/05/05/jsonp-quickly/。
【讨论】: