【问题标题】:XSRF integration to the applicationXSRF 与应用程序的集成
【发布时间】:2014-02-26 23:59:20
【问题描述】:

我试图为我的应用程序实现 XSRF。我按照gwtproject.org 提供的指南进行操作。我什至设置了一个演示,它工作正常。如指南中所述,我用另一个异步调用结束了异步调用以获取 XSRF 令牌,一切正常。

XsrfTokenServiceAsync xsrf = (XsrfTokenServiceAsync)GWT.create(XsrfTokenService.class);
((ServiceDefTarget)xsrf).setServiceEntryPoint(GWT.getModuleBaseURL() + "xsrf");
xsrf.getNewXsrfToken(new AsyncCallback<XsrfToken>() {

  public void onSuccess(XsrfToken token) {
    MyServiceAsync rpc = (MyServiceAsync)GWT.create(MyService.class);
    ((HasRpcToken) rpc).setRpcToken(token);

    // make XSRF protected RPC call
    rpc.doStuff(new AsyncCallback<Void>() {
      // ...
    });
  }

  public void onFailure(Throwable caught) {
    try {
      throw caught;
    } catch (RpcTokenException e) {
      // Can be thrown for several reasons:
      //   - duplicate session cookie, which may be a sign of a cookie
      //     overwrite attack
      //   - XSRF token cannot be generated because session cookie isn't
      //     present
    } catch (Throwable e) {
      // unexpected
    }
});

我的问题:我是否应该为每个异步调用进行两次异步调用是 XSRF 安全的,即一个获取 XSRF 令牌和其他实际异步调用?他们是一种让 XSRF 令牌在每个浏览器会话中使用它的方法吗?我问这个的原因是,我们的已经是一个完全编码的应用程序,如果是以前的情况,我必须编辑每个异步调用并使其 XSRF 安全,更不用说,性能将是一个问题,因为我有每次进行 2 次异步调用。

【问题讨论】:

    标签: gwt csrf


    【解决方案1】:

    只有一个异步调用——不是两个。您的客户端只需获取一次令牌,然后您只需告诉您的服务在每个后续 RPC 调用中都包含此令牌。

    我实际上是使用 JSP 将此令牌添加到主机页面 - 将其设置为 JavaScript 变量,然后从我的代码中访问它。

    【讨论】:

    • 所以你的意思是,一旦我在应用程序启动时获得了一个 xsrf 令牌,我就可以将相同的令牌用于同一应用程序的不同模块的所有未来异步调用?
    • 可以,只要您保持相同的会话。服务器端代码将从客户端获取的令牌与存储在会话中的令牌进行比较,如果不匹配则引发异常。
    猜你喜欢
    • 2010-09-20
    • 2013-09-09
    • 2018-09-04
    • 1970-01-01
    • 2018-09-30
    • 2011-10-14
    • 2019-09-25
    • 2017-10-02
    • 2016-03-23
    相关资源
    最近更新 更多