【问题标题】:IE11 ignores X-Frame-Options after redirectIE11 重定向后忽略 X-Frame-Options
【发布时间】:2018-12-17 19:21:26
【问题描述】:

我有一个通过 Facebook Messenger 应用程序打开的 Web 应用程序。在移动设备上,它在 Facebook Messenger 的 web 视图中打开,在桌面上,它在 iFrame 中打开。这适用于除 IE11 之外的所有浏览器。

我们将 X-Frame-Options 标头设置为“ALLOW-FROM https://www.messenger.com”。当应用程序首次加载到 iFrame 中时,它会毫无问题地加载。然后应用程序使用 302 响应请求并重定向。被重定向到的页面显示错误“此内容无法在框架中显示”。控制台中没有像通常在其他浏览器中阻止 iFrame 内容时出现的错误。

在 iFrame 中是否存在 IE11 不支持的重定向方面的某些方面?

申请详情: 这是一个在客户端使用 JS 的 Django 服务器端呈现的 Web 应用程序。我将尝试分解操作顺序:

请求 1:GET 到返回文档的端点 1 - 这已成功显示在 iFrame 中

请求 2:从客户端的 JS POST 到 endpoint1

const formData = new FormData();

        formData.append('psid', thread_context.psid);
        formData.append('tid', thread_context.tid);

        const xhr = new XMLHttpRequest();

        xhr.onload = function (event) {
            if (this.status !== 200) {
                handleError(this);
                return;
            }

            window.location.href = this.responseURL;
        };
        xhr.onerror = handleError;

        xhr.open('POST', postUrl);
        xhr.send(formData);

响应是带有位置标头的状态代码 302

请求 3:GET 到 302 响应中返回的位置。 响应是状态代码 200,并在正文中包含文档。 这会导致上面的 xhr.onload 触发,然后调用 window.location.href 重定向到之前返回的新位置。

请求 4:GET 作为更新 window.location.href 的结果。响应为状态码 200。此时浏览器显示“内容无法在框架中显示”消息。

这些请求中的每一个都在响应中包含“ALLOW-FROM https://www.messenger.com”的 X-Frame-Options 标头。

【问题讨论】:

  • 您提到应用程序加载后它会以 302 响应请求。您能否尝试提供有关该请求的更多信息。就像您使用的代码一样。你是如何尝试运行它的?或者您可以提供带有步骤的示例代码。我们将尝试运行它并尝试产生问题。
  • 我会尝试在我的帖子中添加更多细节以提供帮助。不幸的是,我不能轻易地组合一个示例应用程序或允许任何人公开访问复制。
  • 我认为问题的根源在于 IE 显然不支持 responseURL 属性 (developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/…),因此它是未定义的。似乎最终请求(“请求 4”)可能是刷新,而不是重定向的位置。所以我需要弄清楚如何在 IE 中正确获取重定向的位置。

标签: internet-explorer-11 facebook-iframe x-frame-options


【解决方案1】:

所以事实证明“内容无法在框架中显示”消息是一个红鲱鱼。问题确实是由于设置:

window.location.href = this.responseURL;

在 IE 和旧版本的 Edge responseURL is not a supported property of XMLHttpRequest 中。此外,在 IE 中的 302 之后似乎无法获取请求 URL。因此,我的解决方案是重写我们返回 302 开头的用法,而是返回一个 JSON 响应,其中包含要重定向到的 URL。

【讨论】:

  • 从您的上一篇文章中,我可以看到您的问题的解决方案很好。我建议您将此线程的解决方案标记为已接受的答案(24 小时后),这可能会帮助其他社区成员将来解决类似问题。感谢您的理解。
  • @Deepak-MSFT 是的,我计划在 24 小时结束后将其标记为已接受的答案,谢谢!
猜你喜欢
  • 2016-09-14
  • 1970-01-01
  • 2011-11-08
  • 2014-03-31
  • 2016-11-04
  • 1970-01-01
  • 2016-11-11
  • 2019-06-25
  • 1970-01-01
相关资源
最近更新 更多