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

Nir*_*ane 19 java struts cross-domain struts-1

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

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

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

Jos*_*son 17

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

  1. 用户通过Struts Action(不直接到JSP)访问表单.Struts Action将saveToken(request)在转发到包含该表单的JSP之前调用.
  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);
}
Run Code Online (Sandbox Code Playgroud)