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

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

我很少有人认为1)我怎么能用简单的方式生成独特的令牌呢? (我可以为此目的使用Action类令牌,用于避免重复的表单提交)

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

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

  1. 用户通过Struts Action(不直接到JSP)访问表单。 Struts Action将在转发到包含该表单的JSP之前调用saveToken(request)
  2. JSP上的表单必须使用标记。
  3. 表单提交的Action将首先调用isTokenValid(request, true) ,如果返回false ,则应重定向回第一个Action并显示错误消息。 这也会重置下一个请求的令牌。

这样做不仅可以防止重复的表单提交,而且任何脚本都必须点击第一个Struts Action并获得一个会话,然后才能提交给第二个Struts Action来提交表单。 由于站点无法为其他站点设置会话,因此应该阻止CSRF。

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

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