如何在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
答
OK通过在登录时使会话无效,从而在另一个只能通过登录页面访问的页面上创建令牌。
任何人有想法? – Graham
好的,我转发我的所有请求,并发现 https://stackoverflow.com/questions/36530341/not-able-to-authenticate-post-request-for-csrf-token-with-tomcat 但添加调度员没有解决这个问题,我唯一能做到这一点的方法是不会使会话无效。 – Graham