XSRF与应用程序的集成

时间:2014-02-26 06:18:33

标签: gwt csrf

我正在尝试为我的应用程序实现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安全,即One获取XSRF令牌和其他实际的异步调用?他们是一种让每个浏览器会话使用XSRF令牌的方法吗?我问的原因是,我们已经是一个完全编码的应用程序,如果是前者,我必须编辑每个异步调用并使其XSRF安全,更不用说,性能将是一个问题,因为我有每次进行2次异步调用。

1 个答案:

答案 0 :(得分:0)

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

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