一尘不染

使用Struts令牌防止跨站点请求伪造

java

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

我对一些想法感到困惑1)如何以简单的方式生成唯一令牌?(我可以为此目的使用Action类令牌来避免重复提交表单)

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


阅读 258

收藏
2020-12-03

共1个答案

一尘不染

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

  1. 用户通过Struts Action(不是直接到达JSP)进入表单。saveToken(request)在转发到包含表单的JSP之前,将调用Struts Action 。
  2. JSP上的表单必须使用<html:form>标记。
  3. 表单提交给您的Action将首先被调用isTokenValid(request, true),如果返回,您应该重定向到第一个Action并显示一条错误消息false。这还将重置下一个请求的令牌。

这样做不仅可以防止重复提交表单,而且任何脚本都必须先击中第一个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);
}
2020-12-03