1

假设我通过 RPC 从 GWT 客户端向服务器发送以下类型的对象。对象被存储到数据库中。

public class MyData2Server implements Serializable
{
    private String myDataStr;
    public String getMyDataStr() { return myDataStr; }
    public void setMyDataStr(String newVal) { myDataStr = newVal; }
}

在客户端,我将字段 myDataStr 限制为最多 20 个字符。

我一直在阅读有关 Web 应用程序安全性的内容。如果我学到了一些东西,那就是客户端数据不应该被信任。然后服务器应该检查数据。所以我觉得我应该在服务器上检查我的字段确实不超过 20 个字符,否则我会中止请求,因为我知道这一定是一次攻击尝试(当然假设客户端没有错误)。

所以我的问题是:

  1. 在服务器端实际检查我的字段不超过 20 个字符有多重要?我的意思是攻击的机会/风险有多大,后果会有多严重?根据我的阅读,它看起来可能会通过溢出和拒绝服务使服务器停机,但不是安全专家,我可能会误解。

  2. 假设我不会浪费时间在服务器上进行字段大小检查,应该如何完成呢?我似乎记得读过(对不起,我不再有参考),一个天真的检查就像

    if (myData2ServerObject.getMyDataStr().length() > 20) throw new MyException();

不是正确的方法。相反,需要定义(或覆盖?)方法 readObject(),类似于此处。如果是这样,那么在 RPC 调用的上下文中应该如何做呢?

先感谢您。

4

1 回答 1

1

在服务器端实际检查我的字段不超过 20 个字符有多重要?

这是 100% 重要的,除非您可以 100% 信任最终用户(例如某些内部应用程序)。

我的意思是有什么机会

一般:增加。确切的概率只能针对您的具体情况单独回答(即这里没有人能够告诉您,尽管我也对一般统计数据感兴趣)。我能说的是,篡改非常容易。它可以在 JavaScript 代码中完成(例如使用 Chrome 的内置开发工具调试器)或通过编辑清晰可见的 HTTP 请求数据来完成。

/攻击的风险以及后果有多严重?

风险可能会有所不同。最直接的风险可以通过思考来评估:“如果您可以将任何 GWT 可序列化对象的任何字段设置为任何值,您可以存储和做什么?” 这不仅是关于超出大小,还可能是篡改用户 ID 等。

根据我的阅读,它看起来可能会通过溢出和拒绝服务使服务器停机,但不是安全专家,我可能会误解。

这是另一个需要处理的级别,无法通过 GWT RPC 方法实现中的服务器端验证来解决。

相反,需要定义(或覆盖?)方法 readObject(),就像这里一样。

我不认为这是一个好方法。它试图完成两件事,但都不能很好地完成。服务器端有两种检查必须完成:

  1. 在低级别上,当字节进入时(在它们被 RemoteServiceServlet 转换为 Java 对象之前)。这需要在每台服务器上处理,不仅是 GWT,还需要在单独的问题中回答(答案可能只是服务器设置的最大请求大小)。
  2. 在逻辑层面上,在您拥有 Java 对象中的数据之后。为此,我会推荐一个验证/授权层。GWT 的一个很棒的特性是,您现在可以在服务器端和客户端使用 JSR 303 验证。它没有涵盖所有方面(您仍然需要测试用户权限),但它可以涵盖您的“@Size(max = 20)”用例。
于 2012-11-11T15:48:29.673 回答