【问题标题】:document.domain same origin policy not workingdocument.domain 同源策略不起作用
【发布时间】:2013-10-04 10:36:55
【问题描述】:

尽管我看过很多文章(包括在 stackoverflow 中)演示如何绕过 javascript 的同源策略分配 document.domain 属性,但它不起作用.我还在 W3C 规范中读到 document.domain 属性是只读的,并非所有浏览器都接受设置它,我认为这是我无法让它工作的原因!

我有一个页面(域 d1.y.com.br),我需要在嵌入式 iframe 的页面(域 d2.x.com.br)中调用一个按钮。我正在将父 document.domain 属性设置为子域“x.com.br”,但我仍然在 firebug 控制台中收到“拒绝访问”错误消息。

我也读过关于 JSONP 的文章,但这里不是这样。我真的需要与 iframe 的 DOM 交互,而不仅仅是从那里获取数据(使用代理服务)。

真的存在绕过同源策略与 iframe 的 DOM 交互的任何方式吗???

【问题讨论】:

    标签: javascript same-origin-policy


    【解决方案1】:

    在 iframe 之间(尤其是跨域)发送数据的正确方法是使用 postMessage()。 https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage

    这有效地“绕过”了问题,让消息的接收者根据它想要的任何规则验证调用者是否拥有正确的域。

    【讨论】:

    • 我同意。问题是,在我的情况下,嵌入页面与我的不协作,也就是说,嵌入页面不期望来自父页面的任何消息(通过 window.postMessage() 发送)。即使是这样,window.postMessage() 也符合 HTML5 而我的页面不符合。
    • 我需要做的是在 iframe 的 DOM 上存在的按钮事件上附加一个事件侦听器,一旦单击此按钮,我就会向父 DOM 发送另一个事件。我需要在 iframe 的 DOM 中捕获一个事件,为此,我需要首先获得访问权限(因为它是跨域的,所以被同源策略阻止)
    • 明白了。在这种情况下,您正在做的事情几乎正是同源策略旨在防止的事情。 IMO 您唯一可行的选择是代理和修改页面以包含您需要的任何内容。显然,您需要确保您所做的事情不会违反网站条款或造成其他非技术/人为问题。
    • 解决该问题的方法可能很简单:w3schools.com/tags/tag_base.asp
    • 代理页面并修改它以包含您的脚本并包含一个 <base href=""/> 以便页面上的外部引用基于它的原始 URL。 (尚未测试,但值得一试。)
    猜你喜欢
    • 2012-08-11
    • 2011-01-25
    • 2014-05-03
    • 2016-12-11
    • 2017-10-05
    • 2017-04-15
    • 2013-03-30
    • 2023-04-07
    • 2014-05-26
    相关资源
    最近更新 更多