2012-04-24 3 views
3

私は、XSRFをWebアプリケーション上で動作させようとしてきました。 私は典型的なログイン実装を検討しています。GWT(2.4.0)+ XSRF

私はGoogle's codeに従っています。 は私が含まれるように、私のweb.xmlを変更:

<servlet> 
    <servlet-name>xsrf</servlet-name> 
    <servlet-class>com.google.gwt.user.server.rpc.XsrfTokenServiceServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>xsrf</servlet-name> 
    <url-pattern>/gwt/xsrf</url-pattern> 
</servlet-mapping> 

<context-param> 
    <param-name>gwt.xsrf.session_cookie_name</param-name> 
    <param-value>JSESSIONID</param-value> 
</context-param> 

と私のログインサービスのサーバーのImplファイルにXsrfProtectedServiceServletを拡張しました。サーバー上に他の変更は必要ないと私は理解しています。 RpcTokenを返すメソッド(実装しているインターフェイスと同様に)を追加する必要がありますか?

クライアント側では、注釈を使用します。

@XsrfProtect 
@RemoteServiceRelativePath("login") 
public interface LoginService extends RemoteService { 
    String check(String user, String pass) throws IllegalArgumentExceptionhere; 
} 

これはおそらく私が何か不足しているところです。 Googleはヒントについて:Tip: To specify which RpcToken implementation GWT should generate serializers for use @RpcTokenImplementation annotation.それが何を意味するのか、私がここでRpcTokenを返すために別の方法が必要なのかどうかはわかりません。

マイ非同期インターフェイスは、このようなものです:

public interface LoginServiceAsync { 
    //Returns the Session ID 
    void check(String user, String pass, AsyncCallback<String> callback); 
} 

その後、私の実際のRPC呼び出しのために、私はXSRFトークン要求のまわりで私のコードをラップ。 GWT.getModuleBaseURL() + "xsrf"

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

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

     // make XSRF protected RPC call 
     rpc.check(user, pass, new AsyncCallback<String>() { 
      // ... 
     }); 
    } 

    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の場所を知らないようgetNewXsrfTokenへの呼び出しが失敗したことを私です:私はGoogleのと同じコードを使用します。このエラーの原因となっているトークンハンドシェイクが存在しないと感じていますが、わかりません。

最後に、私もNick Siderakis' codeを実装しようとしましたが、彼の例ではサーバーに質問するJSPページを使用します:XsrfTokenUtil.getToken(request.getSession().getId())。私はJSPページを使用したくないので、JSPページなしでこれを実行する方法を理解していません。彼のコードもGoogleのコード例とは異なります(つまり、getNewXsrfTokenは呼び出さない)。これは、XSRFを扱う「好きな」Googleの方法であるかどうかわからない。

私には何が欠けていますか?ありがとう。

EDIT以下

ソリューション...

答えて

4

[OK]を私はこの問題を考え出しました。上記のコードでGWT.getModuleBaseURL()+ "xsrf"を "gwt/xsrf"に変更しなければなりませんでした。さらに、サーバはJSESSIONIDクッキーを見つけることができなかったので、私はthisに続き、Cookies.setCookie( "JSESSIONID"、 "JSESSIONID"、null、null、 "/"、false)を追加しました。私のonModuleLoad()内にあります。それがそれでした。乾杯。

+1

ところで、Tomcatを使用している場合は、[session-id]のような別のCookie名を使用することをお勧めします。[here](http://blog.octo.com/gwt-et-securite -se-premunir-des-csrf /)を使用して、Cookieの競合を回避します。 – iliask

+0

HI、btwどの文字列をXSRFクッキーのセッション値に使用しましたか?あなたは常にユーザーランダムですか? – Darwly

+0

こんにちは、あなたは何を意味するか分かりません。 getNewXsrfTokenは引数を取らず、XsrfTokenを返します。次に、RPCサービスの実装でXsrfProtectedServiceServletを拡張することによって、あなたは無料で提供されるsetRpcToken(トークン)を設定します。セッションクッキーに関する限り、あなたがすることは次のとおりです:HttpSession session = this.getThreadLocalRequest()。getSession(); session.getId()はセッションIDを返します。 – iliask

関連する問題