假设我通过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个字符,否则我会中止请求,因为我知道它必须是攻击尝试(假设客户端没有错误)。/ p>
所以我的问题是:
在服务器端实际检查我的字段不超过20个字符有多重要?我的意思是攻击的机会/风险是什么,后果有多糟糕?从我所看到的情况来看,它似乎可以通过溢出和拒绝服务来降低服务器,但不是安全专家,我可能会误解。
假设我不会浪费时间在服务器上进行字段大小检查,那么应该如何实现呢?我似乎记得曾经读过(对不起,我不再有参考资料)这是一个天真的检查,如
if(myData2ServerObject.getMyDataStr()。length()> 20)抛出新的MyException();
不是正确的方法。相反,人们需要定义(或覆盖?)方法readObject(),类似于here。如果是这样,那么应该如何在RPC调用的上下文中进行呢?
提前谢谢。
答案 0 :(得分:1)
在服务器端实际检查我的字段不超过20个字符有多重要?
这是100%重要,除非您可以信任最终用户100%(例如一些内部应用程序)。
我的意思是什么机会
一般来说:增加。确切的可行性只能针对您的具体情况单独回答(即,这里没有人能够告诉您,尽管我也会对一般统计数据感兴趣)。我可以说,篡改是非常容易的。它可以在JavaScript代码中完成(例如使用Chrome的内置开发工具调试器)或编辑清晰可见的HTTP请求数据。
/攻击的风险以及后果有多糟糕?
风险可能会有所不同。可以通过思考来评估最直接的风险:“如果可以将任何GWT可序列化对象的任何字段设置为任何值,那么您可以存储和执行什么操作?”这不仅仅是超出大小,而且可能会篡改用户ID等。
从我所看到的情况来看,它似乎可以通过溢出和拒绝服务来降低服务器,但不是安全专家,我可能会误解。
这是另一个需要处理的问题,并且无法通过GWT RPC方法实现中的服务器端验证来解决。
相反,人们需要定义(或覆盖?)方法readObject(),就像在这里一样。
我认为这不是一个好方法。它试图完成两件事,但不能很好地完成它们。服务器端有两种必须完成的检查: