X-Frame-Options 不起作用 IIS web.config

28

我们的网站目前还不能防止点击劫持,所以我进入了 web.config 并进行了添加。

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="X-Frame-Options" value="DENY" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

这是非常直接的代码。我的问题是它只是不起作用。 我有以下问题:

  1. 有没有办法让我查看头响应中是否存在X-Frame-Options?我使用httpfox搜索它,但什么都没有找到,所以我无法验证web.config是否实际将内容放入头中。
  2. 为什么它不起作用?我能做些什么来测试或继续向前推进吗?

我尝试在Global.asaxApplication_Start方法中添加它,但我似乎无法在调试时“触发”此方法;它不会触发断点。

private void Application_Start(object sender, EventArgs e)
{
    // Code that runs on application startup
    HttpContext.Current.Response.AddHeader("x-frame-options", "DENY");

    LogHelper.Info("Cost of Care Web Application Starting");
}

我想补充一点,我尝试过将其直接添加到头部标签中,还尝试将其添加在像这样的meta标签中

<meta http-equiv="X-Frame-Options" content="deny">

我以前遇到过这个问题,总是不得不直接在代码中放置 X-Frame-OptionsResponse.AddHeader("X-Frame-Options", "DENY"); 但我无法告诉你为什么它不起作用,因为文档看起来应该可以。 - siva.k
我搜索了我的解决方案,发现它已经在 global.asax 文件的 "application_start" 方法中实现了....还有其他选项或建议吗? - Moi Hawk
如果不是从Global.asax中添加它,那么它位于Global的哪个部分? - siva.k
但它在“application_start”方法中。 - Moi Hawk
1
在Global.asax中创建一个protected void Application_BeginRequest(){}方法,并将其添加到其中。 - siva.k
显示剩余3条评论
6个回答

30

X-Frame-Options头可用于控制页面是否可以放置在IFRAME中。由于Framesniffing技术依赖于能够将受害网站放置在IFRAME中,因此Web应用程序可以通过发送适当的X-Frame-Options头来保护自己。

要配置IIS以向给定站点的所有响应添加X-Frame-Options头,请按照以下步骤操作:

  1. 打开Internet Information Services(IIS)管理器。
  2. 在左侧的连接窗格中展开Sites文件夹并选择要保护的站点。
  3. 在中间的功能列表中双击HTTP响应标头图标。 进入图像描述
  4. 在右侧的操作窗格中,单击添加。
  5. 在出现的对话框中,在名称字段中键入X-Frame-Options,并在值字段中键入SAMEORIGIN或DENY。 进入图像描述
  6. 单击“确定”保存更改。

25

既然我的评论回答了这个问题,那么这就是最终结果:

由于某些原因,在web.config中设置X-Frame-Options似乎实际上并不起作用,尽管文档似乎表明它应该起作用。

一个简单的解决方法是手动设置标题:

Response.AddHeader("X-Frame-Options", "DENY");

如果您需要每个请求都使用此设置,且没有任何例外情况,您可以将 Application_BeginRequest 添加到 Global.asax 中:

protected void Application_BeginRequest()
{
    Response.AddHeader("X-Frame-Options", "DENY");
}

14

siva.k的答案在MVC5中不适用,因为这里会生成两次标题。以下代码应该有效:

protected void Application_Start()
{
  //  MVC5 generates the "X-Frame-Options SAMEORIGIN" header by default, the following line disables the default behaviour
  System.Web.Helpers.AntiForgeryConfig.SuppressXFrameOptionsHeader = true;
}

protected void Application_BeginRequest() 
{
  Response.AddHeader("X-Frame-Options", "DENY");
}

在这里提到了SuppressXFrameOptionsHeader标志:https://dev59.com/CGIj5IYBdhLWcg3wcEyI#20262211


9
<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Content-Security-Policy" value="default-src: https:; frame-ancestors 'self' X-Frame-Options: SAMEORIGIN" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

您的web.config条目需要在内容安全策略下,以利用当前编码而不是以前的过时编码。 value="default-src: https: 的内容安全策略值是唯一的,适用于您的网站。

重要的是,在“value =“default-src: https:”之后的内容最重要的是包含在内容安全策略中。


2
这是正确的做法,但指令“frame-anscestors 'self';”应该在分号处停止,而不是继续到X-Frame-Options,在此标头中毫无意义。 - Corrodias

5

还有一件事要考虑:

如果你有独立的后端和UI项目(这在基于REST的网站中非常常见),请确保在UI web.config文件中添加X-Frame-Options。你的API可能允许跨站点调用,因此在API项目中添加头部是没有意义的。


2
我发现某些文件类型(.asp和.htm文件)通过这种机制添加了X-Frame-Options头部,而其他文件(.js)没有。使用IIS管理工具,我从应用程序级别删除了头部,并在服务器级别添加了它,然后所有文件都被添加了头部。

标题不适用于 .js 页面,它们不是显示媒体,而只是脚本。 - volkerk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接