漏洞代碼示例(JAVA servlets)
認證成功後,當前會話不會失效:
public void doAction(HttpServletRequest request, HttpServletResponse response) {
String pwd = request.getParameter("j_password");
String usr = request.getParameter("j_username");
SessionUser user = persistenceController.loginUser(usr, pwd);
String msg = "";
try {
if (user != null) {
// XXX session not invalidated!
request.getSession().setAttribute(Constants.USER, user);
msg = messageGenerator.RedirectMessage("/ok.html");
} else {
msg = messageGenerator.redirectMessage("/error.html");
}
PrintWriter out;
out = response.getWriter();
out.print(msg);
out.flush();
} catch (IOException e) {
// ...
}
}
解決方案是使當前會話無效,然後為新登錄的用戶創建一個新的會話:
request.getSession().invalidate();
request.getSession(true);
另一個漏洞代碼示例
在本例中,註銷時會話不會失效。cookie的值只在用戶的瀏覽器中被清除:
@Override
public void doAction(HttpServletRequest request, HttpServletResponse response) {
Cookie cookie = new Cookie("JSESSIONID","LOGOFF");
response.addCookie(cookie);
// XXX session not invalidated!
response.sendRedirect("/");
}
解決方案是使會話失效:
request.getSession().invalidate();
如何防護
對於會話固定的問題,在用戶身份驗證成功後調用HttpSession類的invalidate方法。然後通過將true傳遞給HttpServletRequest類的getSession方法來創建一個新的會話。
第三方框架可能已經集成了處理會話管理的解決方案;一定要通過閱讀第三方框架的幫助文檔了解如何使會話失效。
確保在註銷時通過調用HttpSession類的invalidate方法使會話失效。