【发布时间】:2016-09-18 17:26:03
【问题描述】:
从服务器请求一个 XSRF 令牌并在整个会话中重复使用它是否足够或我应该请求每个值得保护的操作,例如保存、编辑或先删除 new XSRF 令牌,然后然后执行实际请求?
出现这个问题是因为我不明白为什么我的受 XSRF 保护的请求有效,即使我没有请求新的请求:
public void saveName(Long shopId, Long languageId, String name, OnSuccessCallback<String> success, OnFailureCallback failure) {
Request.<String> doRequest(this.shopService,
asyncCallback -> {
this.shopService.saveName(shopId, languageId, name, asyncCallback);
},
(String result) -> {
// ..
success.onSuccess(result);
}, failure);
}
这里Request#doRequest() 将简单地执行请求,但不会首先请求新的 XSRF 令牌。我必须将其更改为 XsrfRequest#doRequest(),它基本上做同样的事情,但会请求 XSRF 令牌first。
问题是saveName() 应该受到保护:
@XsrfProtect
@RemoteServiceRelativePath("shop")
public interface ShopServlet extends RemoteService {
// ..
String saveName(Long shopId, Long languageId, String name);
}
请注意:在调用saveName() 之前,还有其他几个请求,其中一些已经获得了XSRF 令牌。但是由于我可以保存一个新名称而无需请求一个新名称,所以我感觉之前请求的令牌在这里被重用了。这样可以吗?
我注意到的另一件事是,如果我将 @NoXsrfProtect 添加到 saveName()
@NoXsrfProtect
String saveName(Long restaurantId, Long languageId, String name);
该请求仍将包含 XSRF 令牌信息:
7|2|9|http://localhost:8080/app/|424F33664CAA93E2F8A4A94C57DA5827|com.google.gwt.user.client.rpc.XsrfToken/4254043109|..ShopServlet|saveName|java.lang..
为什么在方法声明为@NoXsrfProtect 的情况下仍将令牌发送到此处?
有人可以向我澄清一下吗?我不想犯任何错误——尤其是在安全相关的问题上..
【问题讨论】: