代码之家  ›  专栏  ›  技术社区  ›  Chris Laplante

当URL设置为运行JavaScript时,同一域策略如何在弹出窗口中工作?

  •  6
  • Chris Laplante  · 技术社区  · 15 年前

    var w = window.open("javascript: makeAnAjaxRequest();");
    

    我的问题是,Ajax请求(在新窗口打开后执行)是否会被视为跨站点请求?相同的域策略是否适用于其页面创建窗口的原始域?

    someAjaxFunction() 只需发出一个Ajax请求,就可以对结果进行操作。我知道函数必须在我打开的窗口中定义。没问题;我有一个缩小的ajax函数,我也可以使用它注入URL。重点是查看请求的限制是什么;即,在哪个域下将应用相同的域策略?

    2 回复  |  直到 15 年前
        1
  •  4
  •   meder omuraliev    15 年前

    来自谷歌的一些信息: http://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_DOM_access

    由于没有附加限定符,术语“同源策略”通常指的是一种机制,它控制JavaScript和其他脚本语言跨域访问DOM属性和方法的能力(引用)。本质上,该模型可归结为三步决策过程:

    如果协议、主机名和-对于Microsoft Internet Explorer以外的浏览器-两个交互页面的端口号匹配,则授予访问权限而不进行进一步检查。 任何页面都可以将document.domain参数设置为当前主机名的右侧完全限定片段(例如,foo.bar.example.com可以将其设置为example.com,但不能设置为ample.com)。如果两个页面显式地、相互地将各自的document.domain参数设置为相同的值,并且满足其余的相同来源检查,则授予访问权限。 如果上述两个条件都不满足,则拒绝访问。

    来自Mozilla的信息

    我无法访问新辅助窗口的属性。我总是在javascript控制台中收到一个错误,上面写着“error:uncaught exception:Permission denied to get property”。为什么?

    有关跨域脚本安全限制的详细信息: http://www.mozilla.org/projects/secu...me-origin.html

    1. 因此,如果协议、主机名和端口与除IE之外的所有浏览器匹配,那么它是同一个域
    2. 如果协议和主机名与IE匹配,则它是同一个域

    否则,您将受到限制。

    编辑-真实答案

    window.open('javascript:doFunction()') 不会做任何事情,除非打开一个新的空白窗口,它不能做任何事情,因为 doFunction

    旁注

    x = window.open('javascript:x = new XMLHttpRequest; x.open("GET", "http://medero.org", false); x.onreadystatechange = function(){ if ( x.readyState != 4 ) { return; }; alert(x); alert( x.responseText );}; try {x.send(null); } catch (e) { alert(e)}; alert("ok"); ');
    

    它在Firefox中失败了。我还没有在MSIE中测试过。但是

    测验:

    ( )Chrome 7(控制台)来自 http://stackoverflow.com:80

    >>> x = window.open('http://google.com', 'fds', 'width=200, height=300')
    >>> x.document.body.innerHTML='test';
    TypeError: Cannot read property 'body' of undefined
    

    ( )Chrome 7(控制台)来自 http://stackoverflow.com:80

    >>> x = window.open('http://stackoverflow.com', 'fds', 'width=200, height=300')
    >>> x.document.body.innerHTML='test';
    "test"
    

    ( )Firefox 3.6(控制台)来自

    >>> x = window.open('http://google.com', 'fds', 'width=200, height=300')
    >>> x.document.body.innerHTML='test';
    Permission denied for <http://stackoverflow.com> to get property Window.document from <http://www.google.com>.
    

    ( )Firefox 3.6(控制台)来自 http://stackoverflow.com:80

    >>>x=window.open('http://stackoverflow.com','fds','width=200,height=300')
    “测试”
    

    ( 失败 )Firefox 3.6(控制台)来自 http://stackoverflow.com:80

    $.ajax({
       url:'http://bing.com',
       success:function(data) {
          alert(data) // blank alert
       }
    })
    

    成功 )Firefox 3.6(控制台)来自 http://stackoverflow.com:80

    $.ajax({
       url:'http://stackoverflow.com',
       success:function(data) {
          alert(data) // success
       }
    })
    
        2
  •  0
  •   Ruan Mendes    15 年前

    如果你提到你真正想做的事情,而不是仅仅好奇,你的问题会得到改进。。。

    推荐文章