Web安全之Cookie管理

前面我们讲到过XSS攻击,其原理就是利用脚本读取用户的Cookie从而造成用户信息泄露。这里我们要介绍Cookie的几个关键属性值HttpOnly、Secure及其用法。


HttpOnly

该属性值的作用就是防止Cookie值被页面脚本读取。一个没有设置HttpOnly的Cookie:

setcookie('name','lf');

效果如下:
Web安全之Cookie管理_第1张图片

这段代码就可能被攻击者用脚本来获取,所以我们应该为Cookie添加HttpOnly属性如下:

setcookie('name','lf');
setcookie('age','23',NULL,NULL,NULL,NULL,TRUE);//HttpOnly属性为true

效果如下:
Web安全之Cookie管理_第2张图片

切记HttpOnly属性只是增加了攻击者的难度,不能达到完全防御XSS攻击。


Secure

接下来要介绍的就是Secure属性了。给Cookie设置该属性时,只有在https协议下访问的时候,浏览器才会发送该Cookie。

还是刚才的代码:

setcookie('age','23',NULL,NULL,NULL,NULL,TRUE);//HttpOnly属性为true

如果我们仅仅设置了HttpOnly属性,只能防止Cookie不被脚本获取,却不能防止Cookie被攻击者通过抓包来读取,如果加上了Secure属性,就算攻击者窃听网络,也无法获取用户明文Cookie了。

setcookie('gf','tyq',Null,Null,Null,TRUE,Null);//Secure属性为true

效果如下:
Web安全之Cookie管理_第3张图片


有效期

最后来说说Cookie的有效期,刚才的代码并没有在服务器中设置强制超时时间,所以万一用户获取到用户的Cookie后,就可以一直使用用户身份登录。
我们在设置Cookie认证的时候,需要加入两个时间,一个是“即使一直在活动,也要失效”的时间,一个是“长时间不活动的失效时间”。并在Web应用中,首先判断两个时间是否已超时,再执行其他操作。

       // 判断会员的cookie是否过期
        if (isLogin) {
            String timeStampStr = (String) map.get(UserAuthenticationContext.TIMESTAMP);
            long loginTime = 0;
            try {
                loginTime = Long.parseLong(timeStampStr);
            } catch (NumberFormatException e) {
                if (logger.isInfoEnabled()) {
                    logger.info(" loginId: " + usr.getLoginId() + " timestamp has exception " + timeStampStr);
                }
            }
            long now = System.currentTimeMillis() / 1000;
            if (now - loginTime > UserAuthenticationContext.COOKIE_VALIDITY) {
                usr.setAuthenticated(false, true);
                if (logger.isInfoEnabled()) {
                    logger.info("loginId: " + usr.getLoginId() + " loginTime: " + loginTime + " nowTime: " + now);
                }
            }
        }

最后形成保护Web应用的综合防御。

你可能感兴趣的:(Web安全)