使用struts token防止跨站请求伪造
我想为我的基于 struts 1.x 框架的 Web 应用程序实现跨站点请求伪造预防。 我知道 struts 2 框架为此提供了令牌拦截器,我可以使用过滤器实现类似的功能。
我对一些想法有点困惑 1)如何以简单的方式生成唯一的令牌? (我可以为此目的使用 Action 类令牌,用于避免重复的表单提交)
使用 struts 1.x 框架令牌机制进行 CSRF 预防是否存在任何问题
I want to implement Cross-site request forgery prevention for my web application which is base on struts 1.x framework.
I know that struts 2 framework provide token interceptor for this and I can implement similar functionality using filters.
I am bit confuse about few thinks
1 ) how I can generate unique token with straightforward way ? (can I use Action class token for this purpose which is use for avoiding duplicate form submission)
Are there any issue in using struts 1.x framework token mechanism for CSRF Prevention
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Struts 1 Action 令牌方法的工作方式与 Struts 2 令牌拦截器类似,它将向您的会话添加令牌并在表单提交时检查它,但这是一个更加手动的过程。基本工作流程是:
saveToken(request)
。
标记。isTokenValid(request, true)
,如果返回false
,您应该重定向回第一个 Action,并显示错误消息。这还会重置下一个请求的令牌。这样做不仅可以防止重复的表单提交,而且任何脚本都必须先点击第一个 Struts Action 并获取会话,然后才能提交到第二个 Struts Action 来提交表单。由于站点无法为另一个站点设置会话,因此这应该可以防止 CSRF。
如果您通常将用户直接发送到您的 JSP,请不要这样做。相反,创建一个继承自
ActionForward
的新类,并将其设置为其execute()
方法:The Struts 1 Action token methods work like the Struts 2 token interceptor in that it will add a token to your session and check it on form submission, but it is a much more manual process. The basic workflow is:
saveToken(request)
before forwarding onto the JSP that contains the form.<html:form>
tag.isTokenValid(request, true)
, and you should redirect back to the first Action with an error message if it returnsfalse
. This also resets the token for the next request.Doing this will not only prevent duplicate form submissions but any script will have to hit the first Struts Action and get a session before it can submit to the second Struts Action to submit the form. Since a site can't set a session for another site, this should prevent CSRF.
If you usually send users directly to your JSP, don't. Instead, create a new class inheriting from
ActionForward
and set this as it'sexecute()
method: