gpt4 book ai didi

GWT (2.4.0) + XSRF

转载 作者:行者123 更新时间:2023-12-03 20:29:52 25 4
gpt4 key购买 nike

我一直在尝试让 XSRF 在 Web 应用程序上运行,但无济于事。我正在查看典型的登录实现。

我正在关注 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。据我了解,服务器上不需要进行其他更改。我是否需要添加任何其他内容,例如在此处(以及我正在实现的接口(interface)中)返回 RpcToken 的方法?

在客户端,我使用注解。

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

这可能是我遗漏的地方。 Google 在提示上说:提示:要指定 GWT 应为使用 @RpcTokenImplementation 注释生成序列化器,要指定哪个 RpcToken 实现。 不确定这意味着什么,或者我是否需要其他方法来返回 RpcToken。

我的异步接口(interface)是这样的:

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

然后对于我的实际 RPC 调用,我将我的代码包装在 xsrf token 请求周围。我使用与谷歌相同的代码:

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
}
});

我提示的是,对 getNewXsrfToken 的调用失败了,因为它不知道此处调用的 xsrf 位置:GWT.getModuleBaseURL() + "xsrf"。我感觉缺少 token 握手导致此错误,但我不确定。

最后,我还尝试实现 Nick Siderakis' code但他的示例使用了一个 JSP 页面,该页面询问服务器:XsrfTokenUtil.getToken(request.getSession().getId())。我不想使用 JSP 页面,而且我还没有想出如何在没有 jsp 页面的情况下执行此操作。他的代码也不同于谷歌代码示例(即他没有调用 getNewXsrfToken),我不知道这是否是谷歌处理 XSRF 的“首选”方式。

关于我缺少什么的任何想法?谢谢。

编辑

下面的解决方案...

最佳答案

好的,我找到问题了。我不得不在上面的代码中将 GWT.getModuleBaseURL() + "xsrf"更改为 "gwt/xsrf",因为它没有指向正确的位置,正如我所怀疑的那样。另外,服务器找不到JSESSIONID cookie,所以我跟着this并添加了 Cookies.setCookie("JSESSIONID", "JSESSIONID", null, null, "/", false);在我的 onModuleLoad() 里面。做到了。干杯。

关于GWT (2.4.0) + XSRF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10298463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com