同域 iframe 的权限被拒绝

Posted

技术标签:

【中文标题】同域 iframe 的权限被拒绝【英文标题】:Permission denied to same-domain iframe 【发布时间】:2016-09-24 18:24:17 【问题描述】:

我一直在努力更新一些旧版软件。我们最近更新了我们系统中使用的几个早就应该更新的工具,随着这些更新,我们的 jQuery 和 AngularJS 工作库发生了变化。

我已经让我们的大部分代码与新的更新一起工作,但这一段已经让我困扰了很长一段时间。有人告诉我,这在更新之前效果很好,之后就停止了。我无法测试这种说法。

使用ng-import,我们引入如下代码:

<iframe id="uploadFrame"   frameborder="0" ng-src="/store/client/productscripts/binderCreate/partials/upload.html?dealer=dealer" name="uploadFrame" scrolling="no" margin margin>
</iframe>

相关文件如下所示:

<html><head>(snip)</head><body>
<form id="uploadForm" enctype="multipart/form-data" method="post" action="http://other.ourdomain.com/clientbinders/upload?dealer=dealer">
<input id="uploadFileInput" type="file" name="uploadFile">
</form>
</body></html>

用户使用 iFrame 中的文件输入来上传他们的新图像。然后,一旦它被加载,我们在 iFrame 之外有一个按钮,用于触发 iFrame 的表单提交。这样,我们可以让用户上传他们的图片并立即看到结果,而无需重新加载整个表单。在添加了大量跟踪代码以尝试确定 javascript 所看到的内容,并尝试了几种不同的访问 iFrame DOM 的方法(.contentWindow.document、.contentDocument 等)之后,此代码如下所示:

function uploadFile()
    var myIfrm = jQuery('#uploadFrame');
    console.log("TEST #uploadFrame");
    console.log(myIfrm);
    console.log(myIfrm.length);
    console.log("TEST #uploadFileInput");
    console.log(myIfrm.contents().find('#uploadFileInput')); // ERROR HAPPENS HERE
    console.log(myIfrm.contents().find('#uploadFileInput').length);
    (snip:  lots more tracking code and eventually a .submit() )

我在指定行收到的错误是:

错误:访问属性“文档”的权限被拒绝

由于 iframe 引用的是同一域上的页面,我不明白为什么应该拒绝该权限。当然,问题是:为什么我访问该 DOM 的权限被拒绝?或者,我应该如何做才能让它发挥作用?

【问题讨论】:

是的,这是一种已知行为。 使用 iframe 时请记住 http://www.example.com != http://example.com @PraveenKumar - 好的,那么已知的解决方案是什么? @GeorgeLee - 是的,但我没有使用 www。一点也不。而且 iframe 没有引用域,它以斜杠开头并从那里继续 - 默认情况下,相同的域。 @PraveenKumar 搞定了。我不明白为什么,但我得到了它的工作。 【参考方案1】:

对于 Iframe,您可以像这样设置域。你应该可以避免Error: Permission denied to access property "document"

  <script type="text/javascript">
        window.document.domain = "ourdomain.com";
    </script>

【讨论】:

试过了。没有帮助。这些不在不同的域上,将其输入到两个位置并引用同一个域并不能解决问题。【参考方案2】:

我还没有弄清楚这里出了什么问题,但我得到了它的工作。不幸的是,这没有任何意义。

在程序的更高级别,使用 ng-import 导入了一个片段,如下所示:

ng-import="'client/productscripts/binderCreate/partials/'"

更新至:

ng-import="'/store/client/productscripts/binderCreate/partials/'"

它开始正常工作。该更改对 ng-import 是否有效没有任何影响。 ng-import 一直有效。但是在更高级别进行更改会导致此级别的代码突然开始工作。抱歉没有包含足够的问题 - 我从来没有想过似乎工作正常的更高级别的 ng-import 会以这种方式影响事情。

【讨论】:

是的……很奇怪。没有区别。

以上是关于同域 iframe 的权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

jquery 代码显示权限被 IE Edge 和 iframe 拒绝

本地开发时 iframe 权限被拒绝错误:我有啥选择?

无法访问我的 iFrame 中的值,这给了我权限被拒绝

错误:在 iFrame 中访问属性“文档”的权限被拒绝

SCRIPT70:在 IE 中访问 iFrame 的权限被拒绝

javascript, iframe, security - 尝试从父窗口访问 js 函数时权限被拒绝