如何在Java中使用Tomcat CSRF保护过滤器和会话失效

时间:2017-11-04 01:13:44

标签: java session tomcat

我已经阅读过Tomcat CSRF保护文件管理器文档,据我了解,入口点必须是不执行安全功能的页面。

据我所知,当使用时,任何入口点都是当前会话中nonce的一部分。

然而,根据OWASP前10条建议,当用户登录并生成新会话时,我会使会话无效。

我发现的问题是,当完成此操作时,如果用户点击仅在登录后才可用的链接,例如更改密码,该密码不构成入口点的一部分,则返回403,由于新会议。

如果用户首先点击其中一个入口点网址,则他们可以点击更改密码链接并访问该页面,因为已创建新的随机数并且此更改密码链接将被覆盖,但如果欢迎页面有其他用户需要使用的链接,他们不能使用后退按钮,然后点击链接然后因为nonce不一样。

我的问题是如何处理这样一个事实,即在创建新会话时,如果没有先点击其中一个入口点网址,就无法访​​问更改密码页面。

我已经看过编码网址了,但也许我的代码不是为了正确处理这个问题,而且我使用JSTL因为它的转义属性有助于防止XSS,我似乎无法找到一种用这个来编码网址的方法。

任何人都可以提供一些建议或选项作为最佳选择。

如果它有助于我包括我的控制器servlet的登录部分,这是通过登录表单post方法到达的。

public class UserController extends HttpServlet {
final static Logger log = LogManager.getLogger(UserController.class);
@Override
public void doPost(HttpServletRequest request,
    HttpServletResponse response)
    throws IOException, ServletException {
String requestURI = request.getRequestURI();
String url = "";
// Register a new user
if (requestURI.endsWith("/subscribeToSite")) {
    url = subscribeToSite(request, response);
}
// Login
if(requestURI.endsWith("/logInToSite")){
    url = logInToSite(request, response);
}
  //try to  login
User user = UserDB.loginUser(mPNum, upwd);
if(user==null){
    url = "/loginerror.jsp";
}else{
       HttpSession session = request.getSession();
       session.invalidate();
       session=request.getSession(true);
       session.setAttribute("loggedUsrID", user.getUserID());
       session.setAttribute("loggedUsrFName", user.getFName());
       url="/schedule/welcome.jsp";
}      
return url;
}//EO user login

1 个答案:

答案 0 :(得分:1)

通过在登录时使会话无效来解决此问题。然后在另一个只能通过着陆页访问的页面上创建令牌。