代码之家  ›  专栏  ›  技术社区  ›  Graham

如何在Java中使用带会话失效的Tomcat CSRF保护滤波器

  •  1
  • Graham  · 技术社区  · 7 年前

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

    我理解,当使用任何入口点时,它们都是当前会话中nonce的一部分。

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

    如果用户首先单击其中一个入口点URL,那么他们可以单击更改密码链接并访问该页面,因为已经创建了一个新的nonce,并且更改密码链接将被此覆盖,但是如果欢迎页面有用户需要使用的其他链接,他们不能使用后退按钮并单击链接,因为nonce不同。

    我的问题是,在创建新会话时,如果不首先单击其中一个入口点URL,则无法访问更改密码页面。

    我已经研究了url的编码,但可能我的代码没有正确地处理这个问题,而且我正在使用JSTL,因为它的转义属性有助于防止XSS,我似乎找不到一种方法用它来编码url。

    谁能提供一些建议或选择,作为什么是最好的做法。

    如果有帮助的话,我将包括控制器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 回复  |  直到 7 年前
        1
  •  1
  •   Graham    7 年前

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