专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java修炼终极指南:133 避免在反序列化时发生DoS攻击

temp10 2024-11-04 14:06:27 java教程 17 ℃ 0 评论

拒绝服务(DoS)攻击通常是恶意行为,目的是在很短的时间内触发对服务器、应用程序等的大量请求。一般来说,DoS攻击是任何故意或意外的行为,有意或无意地压倒一个进程并迫使其变慢甚至崩溃。让我们看一段代码,它是表示反序列化阶段DoS攻击的一个很好的候选:

ArrayList<Object> startList = new ArrayList<>();
       
List<Object> list1 = startList;
List<Object> list2 = new ArrayList<>();
       
for (int i = 0; i < 101; i++) {
           
  List<Object> sublist1 = new ArrayList<>();
  List<Object> sublist2 = new ArrayList<>();
           
  sublist1.add("value: " + i);
  list1.add(sublist1);
  list1.add(sublist2);
  list2.add(sublist1);
  list2.add(sublist2);
  list1 = sublist1;
  list2 = sublist2;
}

我们计划按照以下方式序列化startList对象(我假设Converters.objectToBytes()是从前面的问题中已知的):

Java修炼终极指南:133 避免在反序列化时发生DoS攻击

byte[] startListSer = Converters.objectToBytes(startList);  

一切都很正常,直到我们试图反序列化startListSer。在那一刻,我们得到的不是有效的对象,而是……什么都没有!实际上,应用程序正常启动,但在反序列化阶段只是挂起了。系统变慢,过一会儿,它最终会崩溃。对象图太深了,无法反序列化,这导致了类似于DoS攻击的行为。

解决方案是创建一个过滤器,如果对象的图深度大于一个安全值,则拒绝反序列化。这可以是一个基于模式的过滤器,如下所示:

ObjectInputFilter filter = ObjectInputFilter.Config
  .createFilter("maxdepth=10;java.base/*;!*");

接下来,使用此过滤器调用反序列化过程:

ArrayList startListDeser = (ArrayList)
  Converters.bytesToObject(startListSer, filter);              

我假设Converters.bytesToObject()是从前面的问题中已知的。这一次,反序列化被过滤器拒绝了,从而防止了DoS攻击。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表