浅谈java安全编码指南之堆污染

 更新时间:2021年06月03日 09:52:31   作者:flydean  
什么是堆污染呢?是指当参数化类型变量引用的对象不是该参数化类型的对象时而发生的。我们知道在JDK5中,引入了泛型的概念,在创建集合类的时候,指定该集合类中应该存储的对象类型。如果在指定类型的集合中,引用了不同的类型,那么这种情况就叫做堆污染。

产生堆污染的例子

有同学可能会问了,既然JDK5引入了泛型,为什么还会出现堆污染呢?

这是一个好问题,让我们看一个例子:

public void heapPollution1(){
    List normalList= Arrays.asList("www.flydean.com",100);
    List<Integer> integerList= normalList;
}

上面的例子中,我们使用Arrays.asList创建了一个普通的List。

这个List中包含了int和String两种类型,当我们将List赋值给List的时候,java编译器并不会去判断赋值List中的类型,integerList中包含了非Integer的元素,最终导致在使用的时候会出现错误。

直接给List赋值不会进行类型检查,那么如果我们是直接向List中添加元素呢?

我们看下下面的例子:

private void addToList(List list, Object object){
    list.add(object);
}

@Test
public void heapPollution2(){
    List<Integer> integerList=new ArrayList<>();
    addToList(integerList,"www.flydean.com");
}

上面的例子中,我们定义了一个addToList方法,这个方法的参数是一个普通的List,但是我们传入了一个List

结果,我们发现list.add方法并没有进行参数类型校验。

上面的例子该怎么修改呢?

我们需要在addToList方法的List参数中,也添加上类型校验:

private void addToList(List<Integer> list, Object object){
    list.add(object);
}

如果addToList是一个非常通用的方法怎么办呢?在addToList的参数中添加参数类型是现实的。

这个时候,我们可以考虑使用Collections.checkedList方法来将输入的List转换成为一个checkedList,从而只接收特定类型的元素。

public void heapPollutionRight(){
    List<Integer> integerList=new ArrayList<>();
    List<Integer> checkedIntegerList= Collections.checkedList(integerList, Integer.class);
    addToList(checkedIntegerList,"www.flydean.com");
}

运行上面的代码,我们将会得到下面的异常:

java.lang.ClassCastException: Attempt to insert class java.lang.String element into collection with element type class java.lang.Integer

更通用的例子

上面我们定义了一个addToList方法,因为没有做类型判断,所以可能会出现堆污染的问题。

有没有什么办法既可以通用,又可以避免堆污染呢?

当然有的,我们看下面的实现:

private <T> void addToList2(List<T> list, T t) {
    list.add(t);
}

public <T> void heapPollutionRight2(T element){
    List<T> list = new ArrayList<>();
    addToList2(list,element);
}

上面的例子中,我们在addToList方法中定义了一个参数类型T,通过这样,我们保证了List中的元素类型的一致性。

可变参数

事实上,方法参数可以是可变的,我们考虑下面的例子:

private void addToList3(List<Integer>... listArray){
    Object[] objectArray = listArray;
    objectArray[0]= Arrays.asList("www.flydean.com");
    for(List<Integer> integerList: listArray){
        for(Integer element: integerList){
            System.out.println(element);
        }
    }
}

上面的例子中我们的参数是一个List的数组,虽然List中的元素类型固定了,但是我们可以重新赋值给参数数组,从而实际上修改掉参数类型。

如果上面addToList3的方法参数修改为下面的方式,就不会出现问题了:

private void addToList4(List<List<Integer>> listArray){

这种情况下,List的类型是固定的,我们无法通过重新赋值的方式来修改它。

以上就是浅谈java安全编码指南之堆污染的详细内容,更多关于java安全编码指南之堆污染的资料请关注脚本之家其它相关文章!

相关文章

  • Java中判断对象是否为空的不同方法

    Java中判断对象是否为空的不同方法

    在Java编程中,经常会遇到判断对象是否为空的情况,本篇将深入探讨Java中判断对象是否为空的不同方法,包括使用条件判断、使用Java 8的Optional类、使用Apache Commons Lang库等,通过详细的解释和举例说明,帮助读者正确处理空对象问题,需要的朋友一起看看吧
    2023-11-11
  • Windows Zookeeper安装过程及启动图解

    Windows Zookeeper安装过程及启动图解

    这篇文章主要介绍了Windows Zookeeper安装过程及启动图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • mac安装配置jdk环境变量

    mac安装配置jdk环境变量

    这篇文章主要为大家介绍了mac安装配置jdk环境变量实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 详解Java数据结构之平衡二叉树

    详解Java数据结构之平衡二叉树

    平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。本文将详解介绍一下平衡二叉树的原理与实现,需要的可以参考一下
    2022-02-02
  • Java LocalCache 本地缓存的实现实例

    Java LocalCache 本地缓存的实现实例

    本篇文章主要介绍了Java LocalCache 本地缓存的实现实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-05-05
  • 解决Intellij IDEA 使用Spring-boot-devTools无效的问题

    解决Intellij IDEA 使用Spring-boot-devTools无效的问题

    下面小编就为大家带来一篇解决Intellij IDEA 使用Spring-boot-devTools无效的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • springboot增加注解缓存@Cacheable的实现

    springboot增加注解缓存@Cacheable的实现

    这篇文章主要介绍了springboot增加注解缓存@Cacheable的实现,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 使用ByteArrayOutputStream写入字符串方式

    使用ByteArrayOutputStream写入字符串方式

    这篇文章主要介绍了使用ByteArrayOutputStream写入字符串方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • MyBatis中mapper.java和mapper.xml的关系说明

    MyBatis中mapper.java和mapper.xml的关系说明

    这篇文章主要介绍了MyBatis中mapper.java和mapper.xml的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java ThreadLocal原理解析以及应用场景分析案例详解

    Java ThreadLocal原理解析以及应用场景分析案例详解

    这篇文章主要介绍了Java ThreadLocal原理解析以及应用场景分析案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09

最新评论