Chrome扩展程序:不安全的JavaScript尝试访问具有URL的框架域,协议和端口必须匹配

时间:2012-07-19 21:37:43

标签: javascript google-chrome-extension gmail

此答案指定了解如何访问gmail.com https://stackoverflow.com/a/9439525/222236

上所有iframe的内容

但是在mail.google.com上会抛出此错误:

Unsafe JavaScript attempt to access frame with URL https://plus.google.com/u/0/_/... from frame with URL https://mail.google.com/mail/u/0/#inbox. Domains, protocols and ports must match.

我尝试将*://plus.google.com/*添加到扩展程序清单的匹配项中,但它没有帮助。

更新:在访问内容之前检查网址是否有效,但我的逻辑目前非常粗糙,因为它只检查google plus:

        if(-1==iframes[i].src.indexOf('plus.google.com')) {
            contentDocument = iframes[i].contentDocument;
            if (contentDocument && !contentDocument.rweventsadded73212312) {
                // add poller to the new iframe
                checkForNewIframe(iframes[i].contentDocument);
            }
        }

2 个答案:

答案 0 :(得分:2)

由于same origin policy,访问被阻止 避免错误的正确方法是从不同的来源中排除帧。你的逻辑非常粗糙。它没有专门查看主机名,也没有考虑其他域 颠倒逻辑以获得强大的解决方案:

if (iframes[i].src.indexOf(location.protocol + '//' + location.host) == 0 ||
    iframes[i].src.indexOf('about:blank') == 0 || iframes[i].src == '') {

白名单的说明

  • protocol://host/ = https://mail.google.com
    显然,必须允许当前主持人
  • about:blank和一个空字符串
    这些框架由GMail动态创建和编写脚本。

答案 1 :(得分:1)

mail.google.complus.google.com不是同一个域。现代Web浏览器中的JavaScript实现不允许跨域脚本编写。

不使用不同类型的hackery,解决这个问题的正确方法是通过CORS(http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),在这种情况下你无法使用它。