GWT RPC服务器端安全反序列化以检查字段大小

时间:2012-11-10 23:24:29

标签: gwt rpc

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

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

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

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

所以我的问题是:

  1. 在服务器端实际检查我的字段不超过20个字符有多重要?我的意思是攻击的机会/风险是什么,后果有多糟糕?从我所看到的情况来看,它似乎可以通过溢出和拒绝服务来降低服务器,但不是安全专家,我可能会误解。

  2. 假设我不会浪费时间在服务器上进行字段大小检查,那么应该如何实现呢?我似乎记得曾经读过(对不起,我不再有参考资料)这是一个天真的检查,如

    if(myData2ServerObject.getMyDataStr()。length()> 20)抛出新的MyException();

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

    提前谢谢。

1 个答案:

答案 0 :(得分:1)

  

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

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

  

我的意思是什么机会

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

  

/攻击的风险以及后果有多糟糕?

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

  

从我所看到的情况来看,它似乎可以通过溢出和拒绝服务来降低服务器,但不是安全专家,我可能会误解。

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

  

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

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

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