私は、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以下
ソリューション...
ところで、Tomcatを使用している場合は、[session-id]のような別のCookie名を使用することをお勧めします。[here](http://blog.octo.com/gwt-et-securite -se-premunir-des-csrf /)を使用して、Cookieの競合を回避します。 – iliask
HI、btwどの文字列をXSRFクッキーのセッション値に使用しましたか?あなたは常にユーザーランダムですか? – Darwly
こんにちは、あなたは何を意味するか分かりません。 getNewXsrfTokenは引数を取らず、XsrfTokenを返します。次に、RPCサービスの実装でXsrfProtectedServiceServletを拡張することによって、あなたは無料で提供されるsetRpcToken(トークン)を設定します。セッションクッキーに関する限り、あなたがすることは次のとおりです:HttpSession session = this.getThreadLocalRequest()。getSession(); session.getId()はセッションIDを返します。 – iliask