WEB安全漏洞之Cookie中缺少相关安全属性(HttpOnly、Secure)

漏洞说明

在用webinspect工具对web项目进行扫描,会报一下两种错误:1.Cookie中缺少HttpOnly属性;2.Cookie中缺少Secure属性。

  • HttpOnly属性

    浏览器通过document对象获取Cookie。HttpOnly作为保护Cookie安全的一个属性,一旦被设置,document对象便看不到Cookie了,同时,浏览器在访问网页时不受任何影响,因为Cookie会在Request Header中发送出去。这样,可以保证通过js代码无法读取到Cookie信息,从而避免Cookie受到XSS等攻击。

  • Secure

    当Response设置Secure属性时,标识Cookie只能通过https协议进行传输,如果使用http协议请求服务端,则会要求重新登录,因为Cookie并不能传输到服务器端。

解决方法

有多种解决方法,对Cookie属性进行设置:

  • 第一种,修改tomcat的配置文件
    修改tomcat路径/tomcat/conf/context.xml文件,在context标签中添加useHttpOnly=“true”,如;Secure属性需要在server.xml中配置,如下所示。需要注意的是Secure只用于https协议,我在设置该属性的时候一开始不懂,结果就掉坑里了,后面会提到。

  • 第二种,通过后台代码在Response中写入这两个属性
    现在项目使用的是这种方式。即新增一个过滤器拦截所有的请求,并在Response中写入该属性。在tomcat7及以上版本,支持通过cookie.setHttpOnly(true)的方式设置,但是因为我们现在项目用的还是tomcat6,所以换了一种方式写入该属性。废话不多说,直接上代码:
public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;  
        HttpServletResponse resp = (HttpServletResponse) response; 
        Cookie[] cookies = req.getCookies();
        if(cookies!=null){
            for(Cookie cookie : cookies){
                StringBuilder builder = new StringBuilder();  
                builder.append("JSESSIONID=" + value + "; ");  
                builder.append("HttpOnly; ");
                builder.append("Secure; ");
                resp.setHeader("Set-Cookie", builder.toString()); 
            }
        }
        chain.doFilter(request, response);
	}

但是以上代码存在问题,当你在本地eclipse部署后,直接访问http:ip:8080/webproject后能显示登录页面,但是无论输入账号密码对或错误,点击登录后的结果都是刷新登录页面。原因是在上面我们添加了Secure属性,然而在本地部署的时候,我们一般都是使用的是http方式,导致Cookie不能发送到服务端。

你可能感兴趣的:(WEB安全漏洞)