【问题标题】:"this content cannot be viewed in a frame" error the first time I load the page第一次加载页面时出现“无法在框架中查看此内容”错误
【发布时间】:2018-05-10 11:26:42
【问题描述】:

我开发了一个搜索表单,它托管在我公司的本地服务器(iis、net core 网站)中。该网站是托管在另一台服务器(apache、wamp)中的 Wordpress,也在公司中。两者都有不同的公共 IP,但都托管在同一域的子域下。

比如说,wordpress.company.com 和 search.company.com,我可以控制两者。

我第一次使用 iframe 插件进行测试时,似乎一切正常,但我现在意识到,Edge 中显示了这个错误。所有浏览器都显示相同的行为,但没有显示类似的消息。

此内容无法在框架中显示

这里应该有一些内容,但发布者没有 允许它显示在一个框架中。这是为了帮助保护 您可能进入本网站的任何信息的安全性。

试试这个

在新窗口中打开它(这是 iframe 内容 url 的链接)

奇怪的是我只需要按 F5 就可以正确加载所有内容。

Chrome 控制台中的错误是:

拒绝在框架中显示“http://subdomain.mysite.com/”,因为 它将“X-Frame-Options”设置为“sameorigin”。

如何解决此问题?

【问题讨论】:

  • 此错误通常发生的原因是因为在.htaccess(或其他地方,取决于设置)中,安全方面仅设置为“self”,不允许任何人嵌入您的站点。这样做的目的是避免其他网站假装他们是您,并让用户陷入困境。例如:Header always set Content-Security-Policy: "default-src 'self'"。解决方案是将要嵌入它的域添加到白名单中。我不明白刷新如何解决它...
  • 您能解释一下如何添加域吗?我的意思是两者都在同一个域下,在不同的子域中,但是很快,该网站将移至主域,例如 www.company.com。我不太习惯这种流程
  • 因此,如果现有设置为Header always set Content-Security-Policy: "default-src 'self'; script-src 'self';" 并且我添加了 google.com,则它变为Header always set Content-Security-Policy: "default-src 'self' *.google.com; script-src 'self';"* 是包含所有子域的通配符,但您可以键入特定的)。 CSP 标头的语法是:开引号、属性名称、白名单项目、冒号(根据需要重复)、闭引号。见:developer.mozilla.org/en-US/docs/Web/HTTP/CSP
  • 它似乎解决了部分问题。现在它立即加载而不刷新,但没有加载 css 样式。可能缺少什么?
  • 简单! :) CSS 样式的权限:style-src 'self' *mysite.com;-让我告诉你,一旦你使用 CSP,你还需要为 JS 设置权限(script-src)、图像(img-src)等等。请参阅developer.mozilla.org/en-US/docs/Web/HTTP/CSP - 这很痛苦,但这可以让您完全控制。一个不便(?)我记得有一种方法可以防止 CSS 或 JS 注入,但是你不能拥有任何内联 CSS 或 JS。它们根本不会被应用,并且控制台(在浏览器中)会告诉您“由于这条规则,这种风格已经停止”。它可以设置为...

标签: .net wordpress apache iframe iis-7


【解决方案1】:

问题与here 中描述的问题类似,但由于 .net Core。解决方案也类似。

您还可以在问题的 cmets 中使用 @user770 提出的建议。但是,这并不能解决 iframe 块。这个答案也没有解释为什么刷新页面解决了这个问题。但是,这对用户来说并不是一个好的体验。

因此,解决方案很简单,并且可以通过代码完成,这样如果有人试图覆盖服务器中的 X-Frame-Otions 设置,oyu 会更加安全。任何多重设置都将在“拒绝”中派生。

您必须在项目的 startup.cs 文件中添加此项,以防止 .net core 自动添加 'sameorigin' 设置。

 public void ConfigureServices(IServiceCollection services)
 {
        //YOU CAN HAVE SOME CODE HERE

        services.AddAntiforgery(o => o.SuppressXFrameOptionsHeader = true);
 }

但是,这可能会给您的网站带来风险,并且这种情况适用于您对两个网站和两个域都有控制权的情况。

为了保护站点,您必须设置 X-frame-options 设置以允许您想要的域。再次在 startup.cs 中执行以下操作。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        //YOU MAY HAVE SOME CODE HERE

        app.Use(async (context, next) =>
        {
            context.Response.Headers.Add("X-Frame-Options", "ALLOW-FROM http://*.MYCONTROLLEDDOMAIN.COM https://*.MYCONTROLLEDDOMAIN.COM");
            await next();
        });
    }

这样您将允许您的域在 iframe 中请求该网站。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多