【问题标题】:X-Frame-Options is not working in meta tag?X-Frame-Options 在元标记中不起作用?
【发布时间】:2018-01-09 07:09:57
【问题描述】:

我想通过 iframe 控制限制我的网站内容在其他域中使用。推荐的元标记,即<meta http-equiv="X-Frame-Options" content="deny"> 不起作用。我能做什么?

【问题讨论】:

    标签: html x-frame-options metatag http-equiv


    【解决方案1】:

    您不能在元标记中设置 X-Frame-Options,只能使用 HTTP 标头。

    在这里阅读更多:

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

    例如,如果您使用的是 Apache,您应该在 .htaccess 文件中添加这样一行

    Header set X-Frame-Options DENY
    

    【讨论】:

      【解决方案2】:

      避免在元标记中这样做。在 IIS 或应用程序中执行:

      protected void Application_BeginRequest(object sender, EventArgs e)
      {
        HttpContext.Current.Response.AddHeader("x-frame-options", "DENY");
      }
      

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

      如果要允许特定域,请使用 allow-from 选项而不是拒绝。

      此标头可能不适用于旧浏览器,例如 Mozilla 3.0,因此您还需要实现客户端验证,名为 busting JS。在这里查看:https://www.owasp.org/index.php/Clickjacking_Defense_Cheat_Sheet

      【讨论】:

        【解决方案3】:

        它不会起作用。浏览器错误:X-Frame-Options 只能通过随文档一起发送的 HTTP 标头来设置。里面可能没有设置。

        注意:设置元标记是没有用的!例如,没有效果。不要使用它!只有像下面的例子那样通过 HTTP 头设置,X-Frame-Options 才会起作用。

        来源Link

        配置 Apache:

        Header set X-Frame-Options "deny"
        Header always set X-Frame-Options "sameorigin"
        

        配置 nginx:

        add_header X-Frame-Options sameorigin always;
        

        配置 IIS:

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

        X-Frame-Options 是一种针对点击劫持攻击的缓解技术。它是服务器发送的 HTTP 响应头,用于指示在什么情况下页面内容应显示在框架上下文中。如果违反了 header 指令,理解 header 的浏览器将不会显示页面的内容(例如,如果 evil-example.com 将 good-site.com 放在 iframe 中,但 good-site.com 发送的 header 说X-Frame-Options: DENY. 因此,不会发生点击劫持,因为没有 UI 元素可以显示给受害者。 它不提供针对 CSRF 的保护。阅读更多:clickjacking and ..Security through HTTP response

        【讨论】:

          【解决方案4】:

          如果您需要在响应中添加标头,请考虑在标头即将发送时注册回调来执行此操作。

          在 BeginRequest 和正在发送的响应之间,代码可以完全替换或清除 headers 集合(尽管可能不是,如果您自己编写了所有代码)。

          在这个例子中,我有一些下游代码有时会添加一个x-frame-options 标头,但会丢失一些 HTML 页面。因此代码确保在回调中设置了标头:

          protected void Application_BeginRequest()
          {
              HttpContext.Current.Response.AddOnSendingHeaders(httpContext =>
              {
                  if (isHtmlResponse() && hasNoFrameOptionsHeader())
                  {
                      httpContext.Response.AddHeader("x-frame-options", "SAMEORIGIN");
                  }
          
                  bool isHtmlResponse () {
                      var contentTypeValue = httpContext.Response.Headers["content-type"];
                      return contentTypeValue is null ? false : contentTypeValue.ToLower().Contains("text/html");
                  }
                  bool hasNoFrameOptionsHeader () => httpContext.Response.Headers["x-frame-options"] is null;
              });            
          } 
          

          【讨论】:

            【解决方案5】:

            只需在标题中使用它,100% 工作

            <?php header( 'X-Frame-Options: DENY' ); ?>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-10-08
              • 1970-01-01
              • 2013-11-16
              • 2016-12-14
              • 2017-07-25
              • 2020-07-21
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多