21

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

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

使用 struts 1.x 框架令牌机制进行 CSRF 预防有什么问题吗

4

1 回答 1

19

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);
}
于 2011-03-17T13:05:19.150 回答