在没有服务器端脚本的情况下在javascript中绕过相同的源策略

时间:2010-01-14 19:40:52

标签: javascript cross-domain same-origin-policy

我的环境实际上不允许服务器端脚本(在服务器上“安装”脚本非常困难)。我尝试使用iframe来违反javascript的同源起源;然而,这不起作用。还有其他我不知道的解决方法吗?

谢谢!

2 个答案:

答案 0 :(得分:28)

David Dorward所述,JSON-P是最简单,最快的;然而,还有另一个技巧,特别是使用两个iframe。

两个不使用JSONP解决此问题,您可以执行以下操作。此技术假定您对父页面具有某种开发访问权限。

两个域/网站上有三个页面。

  1. 父页
  2. 内容页面
  3. 跨域通信页面(又名“xdcomm”)
  4. 父页面和xdcomm页面托管在同一个域中,内容页面托管在任何其他域上。内容页面作为iframe嵌入到父页面中,xdcomm页面作为隐藏的iframe嵌入到内容页面中。

    enter image description here

    xdcomm页面包含一个非常简单的脚本,用于检测查询字符串中的GET参数,解析methodargs变量的字符串(其中args是JSON编码的字符串),然后在父页面中使用指定的参数执行指定的方法。一个例子可以是seen here(查看来源)。

    尽管JavaScript的同源策略限制一个域上的代码访问另一个域的代码,但域是否相互嵌套(域A,嵌套在域B中,嵌套在域A中)并不重要。

    因此,简而言之,内容页面通过将iframe的来源更改为http://domaina.com/xdcomm.html?src=foo&args=[1,2,3,4]之类的内容,通过xdcomm页面将消息发送到父页面。这相当于在父页面中执行foo(1,2,3,4)

    此外,请知道已有图书馆可以帮助您解决此问题,例如easyxdm。我在这里解释的是他们使用的技术之一的基础,虽然它可能不那么花哨,但它肯定是一个功能齐全且轻量级的实现。

答案 1 :(得分:2)

希望不会,因为这将是一个安全漏洞! :)

但如果您的网站都是同一个域中的子域,那么document.domain可能会有所帮助。