如何修复X-Frame-Options和X-Content-Type-Options漏洞

问题现象

Web应用系统因未正确配置安全响应头,导致存在以下漏洞:

  1. X-Frame-Options缺失:攻击者可利用点击劫持(Clickjacking)技术,通过透明iframe诱导用户点击恶意页面。

  2. X-Content-Type-Options未设置nosniff:浏览器可能绕过服务器声明的Content-Type,通过MIME-sniffing解析资源,导致非预期脚本执行(如将图片解析为JavaScript)。

问题原因

  1. 配置缺失:服务器或应用框架未默认启用相关安全响应头,需手动配置。

  2. MIME类型依赖风险:浏览器在Content-Type与实际资源类型不匹配时启动嗅探机制,可能被攻击者利用。

  3. 开发:部分开发者未充分关注HTTP头安全配置,或未及时更新服务器配置。

解决方案

通用配置原则

  • X-Frame-Options:推荐设置为SAMEORIGIN(仅允许同源页面嵌套),或DENY(完全禁止嵌套)。

  • X-Content-Type-Options:必须设置为nosniff,禁用浏览器MIME嗅探。

  • X-XSS-Protection:建议启用并设置为1; mode=block,增强XSS防护。

按服务器类型配置

重要

操作之前,建议您为ECS实例创建快照备份数据,避免因误操作造成的数据丢失。

创建快照将产生费用。更多信息,请参见快照计费

  • Apache服务器:在.htaccesshttpd.conf中添加:

    Header always set X-Frame-Options "SAMEORIGIN" 
    Header always set X-Content-Type-Options "nosniff"  
    Header always set X-XSS-Protection "1; mode=block"  

    需确保mod_headers模块已启用。

  • Nginx服务器:在nginx.confserverlocation块中添加:

    add_header X-Frame-Options "SAMEORIGIN";  
    add_header X-Content-Type-Options "nosniff";  
    add_header X-XSS-Protection "1; mode=block";  

    修改后需重启Nginx生效。

  • Tomcat服务器:在conf/web.xml中配置HttpHeaderSecurityFilter

    <filter>  
      <filter-name>httpHeaderSecurity</filter-name>  
      <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>  
      <init-param>  
        <param-name>antiClickJackingOption</param-name>  
        <param-value>SAMEORIGIN</param-value>  
      </init-param>  
    </filter>  
    <filter-mapping>  
      <filter-name>httpHeaderSecurity</filter-name>  
      <url-pattern>/*</url-pattern>  
    </filter-mapping>  

    低版本Tomcat需手动引入高版本HttpHeaderSecurityFilter类。

  • Spring Boot项目:通过自定义过滤器添加响应头:

    @Bean  
    public FilterRegistrationBean<OncePerRequestFilter> securityHeadersFilter() {  
      return new FilterRegistrationBean<>(new OncePerRequestFilter() {  
        @Override  
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) {  
          response.setHeader("X-Frame-Options", "SAMEORIGIN");  
          response.setHeader("X-Content-Type-Options", "nosniff");  
          response.setHeader("X-XSS-Protection", "1; mode=block");  
          filterChain.doFilter(request, response);  
        }  
      });  
    }  
  • IIS服务器:在Web.config中添加:

    <system.webServer>  
      <httpProtocol>  
        <customHeaders>  
          <add name="X-Frame-Options" value="SAMEORIGIN" />  
          <add name="X-Content-Type-Options" value="nosniff" />  
          <add name="X-XSS-Protection" value="1; mode=block" />  
        </customHeaders>  
      </httpProtocol>  
    </system.webServer>