代码之家  ›  专栏  ›  技术社区  ›  Niraj Sonawane

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

  •  19
  • Niraj Sonawane  · 技术社区  · 14 年前

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

    我对很少思考有点困惑 1)如何用简单的方法生成唯一的令牌?(我可以为此目的使用操作类令牌吗?这是为了避免重复的表单提交)

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

    1 回复  |  直到 12 年前
        1
  •  17
  •   Dave Newton    12 年前

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

    1. 用户通过struts操作(而不是直接到JSP)到达表单。Struts动作将调用 saveToken(request) 在转发到包含表单的JSP之前。
    2. JSP上的表单必须使用 <html:form> 标签。
    3. 表单提交的操作将首先调用 isTokenValid(request, true) ,如果返回错误消息,则应重定向回第一个操作。 false . 这也会为下一个请求重置令牌。

    这样做不仅可以防止重复的表单提交,而且任何脚本都必须点击第一个struts操作并获得一个会话,然后才能提交到第二个struts操作来提交表单。由于一个站点不能为另一个站点设置会话,这应该会阻止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);
    }