【问题标题】:Blocked from accessing an Iframe with origin 'null'阻止访问来源为“null”的 iframe
【发布时间】:2014-12-16 14:46:15
【问题描述】:

我正在使用 iframe 进行伪 ajax 文件上传。 iframe 与上传 javascript 在同一个视图中:

<iframe id="upload_iframe" name="upload_iframe" style="position: absolute; left: -999em; top: -999em;"></iframe>

他在我的本地机器上运行良好,但是当我部署到 Azure 网站时,我在 Chrome 的调试控制台中收到以下错误:

未捕获的安全错误:无法读取“contentDocument”属性 来自“HTMLIFrameElement”:阻止了具有原点的框架 “https://acme.azurewebsites.net”来自访问具有原点的框架 “空值”。请求访问的帧具有“https”协议, 被访问的帧具有“数据”协议。协议必须匹配。

我理解这个 iframe 是同源的,因为它严格来说是本地的,但是我如何让浏览器相信它是本地的?也就是说,我应该对 iframe 的来源和协议做些什么来避免这个错误吗?

简而言之,这是我的代码:

dataAccess.submitAjaxPostFileRequest = function (completeFunction) {
    $("#userProfileForm").get(0).setAttribute("action", $.acme.resource.links.editProfilePictureUrl); 
    var hasUploaded = false;
    function uploadImageComplete() {
        if (hasUploaded === true) {
            return;
        }
        var responseObject = JSON.parse($("#upload_iframe").contents().find("pre")[0].innerText);
        completeFunction(responseObject);
        hasUploaded = true;
    }
    $("#upload_iframe").load(function() {
        uploadImageComplete();
    });
    $("#userProfileForm")[0].submit();
};

userProfileForm 表单将其target 属性设置为 iframe。这种上传安排似乎适用于大多数请求,我不知道“未捕获的异常”消息是否只是 Chrome 的观察结果,还是潜在的节目停止者。有没有办法我可以“捕获并忽略”这样的异常,如果发生这种情况,只显示一条通用消息?

【问题讨论】:

  • 您是否尝试在同一站点上为 IFRAME 的 src 属性使用虚拟 URL?示例:&lt;iframe src='blank.html'&gt;&lt;/iframe&gt;。或者根据需要而不是提前将 IFRAME 注入到文档中?

标签: javascript iframe


【解决方案1】:

这可能取决于您的浏览器,但data 协议通常不支持IFRAME 元素,请参阅维基百科条目:

http://en.wikipedia.org/wiki/Data_URI_scheme

它可能在 localhost 上工作,因为 localhost 可以使用不同的身份验证和授权方法(例如,在 Windows 上它可能作为受信任的站点运行,并且可能会自动将您的 Windows 用户凭据传递给服务器等)。我相信同源意味着协议、主机和端口必须全部匹配。由于data 协议与https 不同,因此来源不同,因此出现安全错误。

通常只有以下元素支持数据协议:

  • 对象(仅限图像)(即:非 activeX 控件)
  • img
  • 输入类型=图像
  • 链接
  • 接受 URL 的 CSS 声明

你能发布更多你的代码和问题陈述吗?还有多种其他方法可以完成文件上传。例如,传统的 POST 方法(单个文件)、HTML5 方法(多个文件),甚至使用 javascript 将字节流发送到 Web 服务(我曾经在使用 TWAIN 扫描用户计算机上的文档的 ActiveX 控件中这样做过然后将扫描的图像上传到网站)。

【讨论】:

  • 添加了我的代码。 iframe 在这里看起来很薄,所以我想知道例如是什么让它采用data 协议,或者如何使它采用https 协议。这是我可以在 IE9 中上传“ajaxy”文件的唯一方法。如果我想尝试使用 ActiveX 流式传输文件,我什至不想开始猜测会出现什么复杂情况。
  • 希望您现在解决了这个问题 - 不知何故,我错过了您的更新通知。对于 IE7/8/9,我使用了一个 jQuery UI 对话框,该对话框包含一个用于文件上传的 Iframe,但 Iframe 指向一个具有&lt;form&gt;&lt;input type='file'/&gt;&lt;/form&gt; 的网页(伪代码/省略详细信息)。另外,感谢您仍然支持 IE9;这里的大多数人都忽略了这一点并建议使用更新的浏览器,但由于某种原因,许多 Web 开发人员没有意识到商业/行业采用缓慢,并且经常使用几个版本的旧浏览器。
  • 我不再从事那个项目了,但我不知怎的让它工作了。我认为是当我返回一个包含 JSON 的正确 HTML 文档时,而不仅仅是 JSON。具有讽刺意味的是,客户是 Microsoft SA,它坚持要保持与 IE9 的兼容性。
猜你喜欢
  • 2017-07-20
  • 1970-01-01
  • 2013-10-14
  • 2015-07-29
  • 1970-01-01
  • 2017-04-03
  • 2016-09-28
  • 2017-06-17
  • 1970-01-01
相关资源
最近更新 更多