zoukankan      html  css  js  c++  java
  • java finalize 攻击

    Java可以通过继承父类并实现finalize,在父类构造器抛出异常后,通过将对象引用记录在一个静态域,使得需要被回收的对象保持存活并可以调用相应方法

    现在存在一个被攻击的类,Attacked,在age小于18时,对象的构建会失败

    public class Attacked {
        private int age;
    
        public Attacked(int age) {
            this.age = age;
            if (age < 18) {
                throw new InvalidParameterException("age must great than 18");
            }
        }
    
        public void drink() {
            System.out.println("I can drink,because my age is: " + age);
        }
    }

    通过添加一个攻击子对象

    public class Attacker extends Attacked {
        static Attacked attacked;
        public Attacker(int age) {
            super(age);
        }
    
        @Override
        protected void finalize() throws Throwable {
            attacked = this;
        }
    }

    调用下面方法

        public static void main(String[] args) {
            try {
                new Attacker(10);
            } catch (Exception e) {
            }
            System.gc();
            System.runFinalization();
            attacked.drink();
        }

    可以看到,尽管age小于18,依然可以输出,从而得到错误的结果

    I can drink,because my age is: 10
  • 相关阅读:
    java类型比较_Java数据类型的比较
    学习方法-1:海绵学习法
    性能测试:TPS和QPS的区别
    代码反思
    网站TLS升级 1.0&1.1--1.2
    Mysql常用语法
    初级测试工程师面试指南
    postman实战之断言
    postman预处理脚本实战
    什么是HTTP超文本协议
  • 原文地址:https://www.cnblogs.com/yytxdy/p/13256636.html
Copyright © 2011-2022 走看看