java - 使用 struts token 防止跨站点请求伪造

标签 java struts cross-domain struts-1

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

我对一些想法有点困惑 1)我怎样才能用简单的方式生成唯一的 token ? (我可以为此目的使用 Action 类 token ,用于避免重复提交表单)

使用 struts 1.x 框架 token 机制进行 CSRF 预防是否有任何问题

最佳答案

Struts 1 Action token 方法的工作方式与 Struts 2 token 拦截器类似,因为它会将 token 添加到您的 session 并在表单提交时检查它,但这是一个更加手动的过程。基本工作流程是:

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

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

关于java - 使用 struts token 防止跨站点请求伪造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4303635/

相关文章:

java - 不同泛型类的一个接口(interface)

java - Hello World 示例 struts 时序图

java - j2ee 应用程序中用户友好的 url

java - 应用程序运行时消息包存储在哪里(内存或磁盘)?

javascript - 通过将外部 JavaScript 全局变量替换为 html 中的另一个脚本来重新分配它

javascript - 在 src URL 中没有协议(protocol)的脚本会出什么问题?

java - 如何从另一个类添加值(java)

java - 如何从此字符串中返回一些随机数?

flash - 攻击者如何绕过 crossdomain.xml

java - 当我向 arraylist 添加值以将内容添加到 listview 时,android ram 不断上升