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

问题描述:

我已经阅读了Tomcat CSRF保护文件的文档,并且我的理解是入口点必须是不执行安全功能的页面。如何在Java中使用会话失效的Tomcat CSRF保护过滤器

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

但是,根据OWASP前10名推荐,我在用户登录并生成新会话时使会话无效。

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

如果用户先点击其中一个入口点URL,然后他们可以单击更改密码链接并访问该页面,因为已创建新的临时值并且更改密码链接将由此覆盖,但是如果欢迎页面有用户需要使用的其他链接,他们不能使用后退按钮并单击链接,然后由于随机数不相同。

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

我已经看过编码的URL,但它可能没有编写我的代码来处理此问题,因为我正在使用JSTL,因为它的转义属性有助于防止XSS,我似乎无法找到方法用这个编码url。

任何人都可以提供一些建议或选择,因为最好做什么。

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

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 
+0

任何人有想法? – Graham

+0

好的,我转发我的所有请求,并发现 https://stackoverflow.com/questions/36530341/not-able-to-authenticate-post-request-for-csrf-token-with-tomcat 但添加调度员没有解决这个问题,我唯一能做到这一点的方法是不会使会话无效。 – Graham

OK通过在登录时使会话无效,从而在另一个只能通过登录页面访问的页面上创建令牌。