使用struts令牌进行跨站点请求防伪

时间:2010-11-29 12:21:47

标签: java struts cross-domain struts-1

我想为基于struts 1.x框架的Web应用程序实现跨站点请求防伪。 我知道struts 2框架为此提供了令牌拦截器,我可以使用过滤器实现类似的功能。

很少有人认为我有点困惑 1)我如何以简单的方式生成唯一令牌? (我可以为此目的使用Action类令牌,用于避免重复的表单提交)

使用struts 1.x框架令牌机制进行CSRF预防是否存在任何问题

1 个答案:

答案 0 :(得分:17)

Struts 1 Action令牌方法的工作方式类似于Struts 2令牌拦截器,因为它会在会话中添加一个令牌并在表单提交时进行检查,但这是一个更加手动的过程。基本工作流程是:

  1. 用户通过Struts Action(不直接访问JSP)访问表单。在转发到包含表单的JSP之前,Struts Action将调用saveToken(request)
  2. JSP上的表单必须使用<html:form>标记。
  3. 表单提交的Action将首先调用isTokenValid(request, true),如果返回false,您应该重定向回第一个Action并显示错误消息。这也会重置下一个请求的令牌。
  4. 执行此操作不仅可以防止重复的表单提交,而且任何脚本都必须点击第一个Struts Action并获得会话才能提交给第二个Struts Action以提交表单。由于站点无法为其他站点设置会话,因此应该阻止CSRF。

    如果您经常将用户直接发送到JSP,请不要。相反,请创建一个继承自ActionForward的新类,并将其设置为execute()方法:

    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)  throws Exception {
        saveToken(request);
        return super.execute(mapping, form, request, response);
    }