MVC 5阻止通过Iframe访问内容

时间:2013-11-27 22:29:19

标签: asp.net-mvc

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

X-Frame-Options:SAMEORIGIN

我理解添加此标记的安全性好处,但其中一个页面应包含在其他项目的iframe中(在其他域上),这个额外的标头阻止了这一点。

我已经确认它不是主机IIS7服务器添加标头,当我降级回MVC4时 - 标头消失了。

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

5 个答案:

答案 0 :(得分:88)

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

但我们可以在Application_Start中的Global.asax.cs中将其关闭。

示例

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

<强>更新

我写了一篇关于此MVC5 prevents your website being loaded in an IFRAME

的帖子

答案 1 :(得分:4)

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

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

编辑:

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

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

答案 2 :(得分:2)

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

此技术尊重SuppressXFrameOptionsHeader设置,但在删除所有以前添加的X-Frame-Options标头方面存在缺点,即使是SAMEORIGIN以外的值也是如此。< / p>

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);
}

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

就我个人而言,在整个站点上禁用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);
    }
}