会话标识未更新
严重性: 中
CVSS 分数: 6.4
URL: http://119.60.12.114:18079/NXZDWRYZXJC/action/user/login
实体: login (Page)
风险: 可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查
看或变更用户记录以及执行事务
原因: Web 应用程序编程或配置不安全
固定值: 登录之后更改会话标识符值
差异:
推理: 测试结果似乎指示存在脆弱性,因为“原始请求”和“响应”中的会话标识相同。这些标志应该已在响应中更新。
解决方法
方案一:
如果不需要保留上一次的session,直接在每次访问登陆时清除上一次的session:
在登录页面上加上一段代码:
request.getSession().invalidate();//清空session
Cookie cookie = request.getCookies()[0];//获取cookie
cookie.setMaxAge(0);//让cookie过期
然后用户再输入信息登录时,就会产生一个新的session了。
方案二:更新上一次的session信息,保证再Tab页打开已登录的系统session能更新共享使用。
if (request instanceof HttpServletRequest) {
HttpServletRequest httpRequest = (HttpServletRequest) request;
if (httpRequest.getSession() != null) {
HttpSession session = httpRequest.getSession();
HashMap<String, Object> old = new HashMap<String, Object>();
Enumeration<String> keys = session.getAttributeNames();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
old.put(key, session.getAttribute(key));
session.removeAttribute(key);
}
if (!httpRequest.getSession().isNew()){
session.invalidate();
session = httpRequest.getSession(true);
}
for (Iterator<Entry<String, Object>> it = old.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it.next();
session.setAttribute((String) entry.getKey(), entry.getValue());
}
}
}