[安全]检测出项目内的安全漏洞,如启用了不安全的HTTP方法,会话Cookie中缺少某某属性等

目录

1.启用了不安全的HTTP方法

2.开启OPTIONS方法

3.错误页面Web应用服务器版本泄露

4.X-Frame-Options Header未配置

5.会话Cookie中缺少secure/HttpOnly属性

6.敏感目录


 

  前段时间收到了第三方发过来的网站安全评估报告,发现我所管理的很多项目有各种漏洞,总结下来如下,做个笔记以便后续自己写项目时注意避免和修正,也为后续有类似的问题有更快的解决,也给大家一种解决方案.

    罗列 启用了不安全的HTTP方法,开启OPTIONS方法,错误页面Web应用服务器版本泄露,X-Frame-Options Header未配置,会话Cookie中缺少secure属性,会话Cookie中缺少HttpOnly属性,敏感目录,如何解决.

1.启用了不安全的HTTP方法

1)HTTP方法

HTTP目前有两个版本,HTTP1.0和HTTP1.1
HTTP1.0定义了三种请求方法:GET,POST,HEAD
HTTP1.1在1.0的基础上新增了五种请求方法:OPTIONS,PUT, DELETE,TRACE,CONNECT

WebDAV(也是一种协议)完全采用了HTTP1.1的方法,扩展了一些方法:例如Lock和Unlock(写文件锁定及解锁)等

2)解决方案

<!--方法1--如果是tomcat服务器启动的项目-->
tomcat服务器内的应用及(WEB-INF)下的web.xml中增加如下代码
<security-constraint>
  <web-resource-collection>
    <web-resource-name>fortune</web-resource-name>
       <url-pattern>/*</url-pattern>
       <http-method>PUT</http-method>
       <http-method>DELETE</http-method>
       <http-method>HEAD</http-method>
       <http-method>OPTIONS</http-method>
       <http-method>TRACE</http-method>
     </web-resource-collection>
  <auth-constraint></auth-constraint>
</security-constraint>

<!--方法2--如果是tomcat服务器启动的项目-->
直接修改tomcat的web.xml,插入代码同上.最终效果是一样的,不过是在外围tomca外围就处理了,对于webapps里面有多个项目来说,这样更简单.

<!--
补充说明:
<security-constraint>用于限制对资源的访问
<auth-constraint>用于限制那些角色可以访问资源,这里设置为空就是禁止所有角色用户访问
<url-pattern>指定需要验证的资源
<http-method>指定那些方法需要验证
-->

<!--方法3--如果是springboot项目,通过java -jar启动的,默认使用内嵌的tomcat-->
需要在Application.java这个启动类中加入代码,最终代码效果如下:

@EnableZuulProxy
//@EnableEurekaClient
@SpringBootApplication
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
    //修改内嵌tomcat的请求类型限制
    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {// 1
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                collection.addMethod("HEAD");
                collection.addMethod("PUT");
                collection.addMethod("DELETE");
                collection.addMethod("OPTIONS");
                collection.addMethod("TRACE");
                collection.addMethod("COPY");
                collection.addMethod("SEARCH");
                collection.addMethod("PROPFIND");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        //如果需要禁用TRACE请求,需添加以下代码:
        tomcat.addConnectorCustomizers(connector -> {
            connector.setAllowTrace(true);
        });
        return tomcat;
    }
}

2.开启OPTIONS方法

这个问题被包含在了上面的 启用了不安全的HTTP方法,通过上面的方式,解决了.

3.错误页面Web应用服务器版本泄露

<!-- 本次检出这个漏洞的均为nginx服务器,需要隐藏nginx版本信息 -->
第一步:在nginx的安装路径下找到配置文件nginx.conf,在http下加入"server_tokens off;"字段即可

http {
...
server_tokens off;
...

}

-------------------------------------------------------------------------------------
<!-- 第一步已经处理了问题.如果想进一步将 默认的错误页面定向到 指定页面,可以这么处理 -->
@第二步: 
  <!-- 如果使用的nginx服务器,在配置文件nginx.conf内的http下加入"proxy_intercept_errors on;"表示启用错误拦截
      指定错误跳转文件,设置 error_page 
  -->
http {
...
proxy_intercept_errors on;
...
    server {
    ...
    error_page 404 /404.html
    error_page 500 502 503 504 /50x.html
    ...

}

  <!-- 如果未使用nginx服务器,使用tomcat启动的项目
       在具体项目的WEB-INF下的web.xml或者直接tomcat下的conf/server.xml中加入如下代码
   -->
<error-page> 
    <error-code>404</error-code> 
    <location>/404.html</location> 
</error-page>


4.X-Frame-Options Header未配置

<!-- 方法1:如果服务器中有nginx -->
在nginx的安装路径下找到配置文件nginx.conf,在http下加入"add_header X-Frame-Options SAMEORIGIN;"字段即可

http {
...
add_header X-Frame-Options SAMEORIGIN;
...

}
<!-- 方法2:如果服务器中没有nginx,且为非springboot项目 -->
需要在代码层面,定义过滤器Filter或者拦截器Servlet进行处理. 

<!-- 自定义的Filter中 -->
public class XFOFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        //在response设置header
        if(resp.getHeader("X-Frame-Options")==null){
            resp.addHeader("X-Frame-Options","SAMEORIGIN");
        }
        filterChain.doFilter(request, response);
    }

    public void init(FilterConfig arg0) throws ServletException {
    }
}
<!-- 将Filter载入项目中 -->
    <!-- 如果项目有WEB-INF的web.xml文件 -->
<filter>
    <filter-name>XFOFilter</filter-name>
    <filter-class>项目自定义的Filter package.XFOFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>XFOFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

    <!-- 如果无web.xml文件,为springboot项目,则通过java代码加载配置 -->
在Filter.java上加入注解@WebFilter
在Application.java上加入注解@ServletComponentScan

5.会话Cookie中缺少secure/HttpOnly属性

<!--编写Filter-->
public class CookieSecureAndHttpOnlyFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain filterChain) throws IOException, ServletException {
        // 解决检测到会话 cookie 中缺少 Secure/HttpOnly 属性
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        Cookie[] cookies = req.getCookies();
        /*if(cookies!=null){
            for(Cookie cookie : cookies) {
                cookie.setHttpOnly(true);
                cookie.setSecure(true);
            }*/
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                String value = cookie.getValue();
                StringBuilder builder = new StringBuilder();
                builder.append("JSESSIONID=" + value + "; ");
                builder.append("Secure; ");
                builder.append("HttpOnly; ");
                resp.setHeader("Set-Cookie", builder.toString());
            }

        }
        filterChain.doFilter(request, response);
    }

    public void init(FilterConfig arg0) throws ServletException {
    }
}
<!-- 将Filter载入项目中 -->
    <!-- 如果项目中有web.xml,则将Filter设置到WEB-INF下的web.xml设置下 -->
<filter>
    <filter-name>CookieSecureAndHttpOnlyFilter</filter-name>
    <filter-class>项目自定义的Filter package.CookieSecureAndHttpOnlyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CookieSecureAndHttpOnlyFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
    <!-- 如果项目中没有web.xml,则采用java代码配置的方式 -->
在Filter上加入注解@WebFilter
在Application上加入注解@ServletComponentScan

6.敏感目录

<!--一般为第三方服务器工具,例如tomcat的默认文件,识别为敏感路径,容易暴露出服务器的一些信息,导致黑客攻击-->
将对应的敏感路径删除 或 改名即可
建议改名,万一删除目录后导致项目异常,可以再改回来.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值