【问题标题】:X-Frame-Options not working IIS web.configX-Frame-Options 不工作 IIS web.config
【发布时间】:2014-10-08 14:53:11
【问题描述】:

我们的网站目前无法避免点击劫持,所以我进入了 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. 为什么这不起作用?我可以做些什么来测试或继续前进?

我确实尝试在Application_Start 方法的Global.asax 中添加它,但我在调试时似乎无法“命中”这个方法;它没有达到断点。

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

我想补充一点,我已经尝试将它直接添加到 head 标签中,我也尝试将它添加到这样的元标签中

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

【问题讨论】:

  • 我以前遇到过这个问题,并且总是发现自己必须将X-Frame-Options 直接放在代码中:Response.AddHeader("X-Frame-Options", "DENY"); 我无法告诉你为什么它不起作用,尽管作为文档让它看起来应该。
  • 我搜索了我的解决方案,发现它已经在 global.asax 的“application_start 方法....
  • 如果不是从 Global.asax 中添加的,它在 Global 的哪个部分?
  • (在上面进行了编辑)但它在“application_start)方法中
  • 在 Global.asax 中创建一个protected void Application_BeginRequest(){} 方法并将其添加到那里。

标签: iis x-frame-options


【解决方案1】:

因为我的 cmets 回答了这个问题,所以这是最终结果:

出于某种原因,在 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");
}

【讨论】:

    【解决方案2】:

    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://stackoverflow.com/a/20262211/3936440

    【讨论】:

      【解决方案3】:

      还有一点需要考虑:

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

      【讨论】:

        【解决方案4】:

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

        要配置 IIS 以将 X-Frame-Options 标头添加到给定站点的所有响应中,请执行以下步骤:

        1. 打开 Internet 信息服务 (IIS) 管理器。
        2. 在左侧的“连接”窗格中,展开“站点”文件夹并选择要保护的站点。
        3. 双击中间功能列表中的HTTP Response Headers 图标。
        4. 在右侧的“操作”窗格中,单击“添加”。
        5. 在出现的对话框中,在名称字段中键入X-Frame-Options,在值字段中键入SAMEORIGINDENY
        6. 单击“确定”保存更改。

        【讨论】:

          【解决方案5】:

          我发现某些文件类型(.asp 和 .htm 文件)正在获取由该机制添加的 X-Frame-Options 标头,而其他 (.js) 则没有。使用 IIS Admin 实用程序,我从应用程序级别删除了标头并将其添加到服务器级别,然后所有文件都添加了标头。

          【讨论】:

          • 标头不适用于 .js 页面,它们不是显示媒体,只是脚本。
          【解决方案6】:
          <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:' 之后的内容,但最重要的是包含在内容安全策略中。

          【讨论】:

          • 这是正确的方法,但是指令“frame-anscestors 'self';”应该停在那里,用分号,而不是继续X-Frame-Options,这在这个标题中没有意义。
          猜你喜欢
          • 2017-07-25
          • 2019-06-24
          • 2014-05-29
          • 2018-06-27
          • 1970-01-01
          • 2018-11-24
          • 1970-01-01
          • 2014-05-10
          • 2014-02-11
          相关资源
          最近更新 更多