2

我正在尝试防止 XSRF 攻击GWTP 应用程序。像 JSESSION 这样的问题很容易进入paroz 测试工具,如果用户已经登录并且同时通过 paroz 发出相同的服务器请求,则使用该工具。它使用更新的值执行相同的事务,这是一个安全问题。

要停止那个,需要为每个请求创建新的 cookie并从客户端发送到服务器。

@SecurityCookie
public static final String securityCookieName = getRandomString(); //Not work

对于客户端模块

public class ClientModule extends AbstractPresenterModule {

    @Override
    protected void configure() {

        bindConstant().annotatedWith(SecurityCookie.class).to(
                NameTokens.securityCookieName);

在 DispatchServletModule 中

public class DispatchServletModule extends ServletModule {

    @Override
    public void configureServlets() {
        bindConstant().annotatedWith(SecurityCookie.class).to(NameTokens.securityCookieName);

我想随机生成 cookie 而不是“JSESSIONID”。如何/在哪里做?在 GWTP 中为每个请求重新生成 cookie 的正确方法是什么?

4

1 回答 1

0

对于通用 gwt,请参阅XSRF 保护

它用于 RPC 调用:

RPC XSRF 保护是使用 RpcToken 功能构建的,它允许开发人员使用 HasRpcToken 接口在 RPC 端点上设置令牌,并将该令牌包含在通过该端点进行的每个 RPC 调用中。

您必须重写要在获取令牌的回调中调用的 rcp 调用,但这并不难实现。

编辑

我不明白需要一个随机的 cookie 名称。对于标准 GWT 保护,您必须指定一个集合名称:

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

您明确引用的 gwtp 状态的文档:

为了保护您的应用程序免受 XSRF 攻击,如 GWT 应用程序的安全性中所述,您必须指定要使用的安全 cookie 的名称。 通过在客户端和服务器上绑定一个用@SecurityCookie 注释的字符串常量来做到这一点。

我认为用户是否登录并不重要。恶意代码无法读取 JSESSIONID cookie(或您指定的任何 cookie),它需要 cookie 的值(确保它可以发送 cookie,但因为恶意代码需要该值,以便它可以计算您发送每个请求的唯一令牌)。这就是文档所说的:

默认 XSRF 保护实现通过生成会话 cookie 值的 MD5 哈希并将生成的哈希用作 XSRF 令牌,从会话身份验证 cookie 派生 XSRF 令牌。这种无状态的 XSRF 保护实现依赖于攻击者无权访问会话 cookie,因此无法生成有效的 XSRF 令牌这一事实

因此,您确实需要指定您的 cookie 名称才能将其配置为工作,否则GWT 无法使用该 cookie 的值来生成您在每次 rpc 调用之前获得并包含在每个 rpc 调用中的端点令牌。

因此,虽然我认为您不需要实现自己的XSRF 保护,因为您没有使用标准 gwt,但我认为您确实需要遵循您引用的文档来配置 gwtp 以使用它的 xsrf 保护实现。

于 2012-08-15T12:20:02.713 回答