【问题标题】:MVC 5 prevents access to content via IframeMVC 5 阻止通过 iframe 访问内容
【发布时间】:2013-11-27 22:29:18
【问题描述】:

自从从 MVC4 升级到 MVC5 后,我注意到我的网页中添加了一个额外的服务器标头:

X-Frame-选项:SAMEORIGIN

我了解添加此标记的安全优势,但其中一个页面旨在包含在来自其他项目(在其他域上)的 iframe 中,这个额外的标头可以防止这种情况发生。

我已验证添加标头的不是托管 IIS7 服务器,当我降级回 MVC4 时 - 标头消失了。

有谁知道如何从 MVC5 中删除此默认设置?

【问题讨论】:

  • 这个same question 刚刚被问到,所以如果你在这里没有得到答案,请留意那个。

标签: asp.net-mvc


【解决方案1】:

MVC5 自动添加带有SAMEORIGIN 的 HTTP 标头 X-Frame-Options。这可以防止您的网站被加载到iframe

但我们可以在Application_Start 中的Global.asax.cs 中关闭此功能。

示例

protected void Application_Start()
{
    AntiForgeryConfig.SuppressXFrameOptionsHeader = true;
}

更新

我已经写了一篇关于这个MVC5 prevents your website being loaded in an IFRAME的帖子

【讨论】:

  • 如果我只想允许某些页面被 iframe 加载怎么办?以前我有一个自定义属性AllowAnyOriginAttribute : ActionFilterAttribute。我可以根据请求更改配置,还是在这种情况下仍然首选Application_PreSendRequestHeaders(根据stackoverflow.com/a/20254341/65611)?
  • 谢谢,这个助手@Html.AntiForgeryToken() 是导致添加标题的原因。在 AntiForgeryWorker.cs 中:if (!this._config.SuppressXFrameOptionsHeader) httpContext.Response.AddHeader("X-Frame-Options", "SAMEORIGIN");
  • 你可以把这个添加到你的web.config<system.webServer> ... <httpProtocol> <customHeaders> <add name="X-Frame-Options" value="SAMEORIGIN" /> </customHeaders> </httpProtocol> ... </system.webServer>
  • 此答案需要您的 global.asax 文件中的 System.Web.Helpers 命名空间。
【解决方案2】:

Global.asax 中尝试这样的事情:

protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
 {
   HttpContext.Current.Response.Headers.Remove("X-Frame-Options");
 }

编辑:

看看answer of Colin Bacon。它比我的更正确。

简而言之 - 如果您不想在 IFRAME 中运行您的网站,请不要删除此标头,因为它会打开伪造漏洞。但如果您仍想删除它 - 在Application_Start 中使用AntiForgeryConfig.SuppressXFrameOptionsHeader = true;,这样做会更干净。

【讨论】:

  • 感觉有点像hack,就在页面发出之前,标签被剥离,但它有效,所以我接受你的回答。 - 很高兴知道为什么要添加标签。
  • 我们实际上可以在 app_start 中使用 AntiForgeryConfig.SuppressXFrameOptionsHeader = true; 抑制这个
  • 不错。用 300 个表单标签轻松修复不太好的代码,每个标签都有防伪标签。
  • 如果您只想允许通过 IFrame 访问某些页面,这不是更好的答案吗?
【解决方案3】:

如果您想要更多的灵活性,这里有一个 ActionAttribute,它可以根据白名单添加/删除标头。如果引用者不在白名单中,则 SAMEORIGIN 标头将保留在原处。我打算粘贴代码,但 SO 抱怨长度。

https://long2know.com/2016/06/asp-net-anti-forgery-xframe-options/

【讨论】:

    【解决方案4】:

    这是HtmlHelper 类的替代扩展方法。它将首先清除所有 X-Frame-Options 标头,然后添加一个通常由内置AntiForgeryToken 方法添加的X-Frame-Options 标头。

    此技术尊重 SuppressXFrameOptionsHeader 设置,但缺点是删除 all 以前添加的 X-Frame-Options 标头,即使是那些具有除 SAMEORIGIN 以外的值的标头。

    public static MvcHtmlString AntiForgeryTokenSingleHeader(this HtmlHelper html)
    {
        string token = AntiForgery.GetHtml().ToString();
        HttpResponseBase httpResponse = html.ViewContext.HttpContext.Response;
    
        httpResponse.Headers.Remove("X-Frame-Options");
        if (!AntiForgeryConfig.SuppressXFrameOptionsHeader)
        {
            httpResponse.AddHeader("X-Frame-Options", "SAMEORIGIN");
        }
        return new MvcHtmlString(token);
    }
    

    【讨论】:

      【解决方案5】:

      就个人而言,我认为禁用整个站点的 X-Frame-Options 不是一个好主意。我创建了一个 ASP.NET MVC 过滤器来删除此标头,我只是将此过滤器应用于部分在 iFrame 中使用的网站,例如小部件。

      public class AllowDifferentOrigin : ActionFilterAttribute, IActionFilter
      {
          public override void OnResultExecuted(ResultExecutedContext filterContext)
          {
              filterContext.HttpContext.Response.Headers.Remove("X-Frame-Options");
              base.OnResultExecuted(filterContext);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 2021-02-01
        • 2016-04-11
        • 1970-01-01
        • 2021-09-09
        • 2012-06-26
        相关资源
        最近更新 更多