我想为基于struts 1.x框架的Web应用程序实现跨站点请求防伪。 我知道struts 2框架为此提供了令牌拦截器,我可以使用过滤器实现类似的功能。
很少有人认为我有点困惑 1)我如何以简单的方式生成唯一令牌? (我可以为此目的使用Action类令牌,用于避免重复的表单提交)使用struts 1.x框架令牌机制进行CSRF预防是否存在任何问题
答案 0 :(得分:17)
Struts 1 Action令牌方法的工作方式类似于Struts 2令牌拦截器,因为它会在会话中添加一个令牌并在表单提交时进行检查,但这是一个更加手动的过程。基本工作流程是:
saveToken(request)
。<html:form>
标记。isTokenValid(request, true)
,如果返回false
,您应该重定向回第一个Action并显示错误消息。这也会重置下一个请求的令牌。执行此操作不仅可以防止重复的表单提交,而且任何脚本都必须点击第一个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);
}