【问题标题】:How to use Tomcat CSRF protection filter with session invalidation in Java如何在 Java 中使用带有会话失效的 Tomcat CSRF 保护过滤器
【发布时间】:2017-11-19 00:45:47
【问题描述】:

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

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

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

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

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

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

我已经研究过对 url 进行编码,但可能我的代码没有正确处理这个问题,而且我正在使用 JSTL,因为它的转义属性有助于防止 XSS,我似乎找不到解决方法用这个编码网址。

任何人都可以提供一些建议或选项作为最好的做法。

如果有帮助,我将包括我的控制器 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

【问题讨论】:

  • 有人有想法吗?
  • 好的,我正在转发我的所有请求并找到stackoverflow.com/questions/36530341/… 但是添加调度程序并不能解决问题,我可以让它工作的唯一方法是不使会话无效。

标签: java session tomcat


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 2018-06-02
    • 2014-07-31
    • 2014-05-02
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多