Java安全入门笔记(持续更新)

2023-09-19 11:25:58

之前陆陆续续学过一点Java安全,笔记一直都没没有系统的写过,现在重新深入学一下之前的知识,会把笔记持续更新过来

Java反射

反射是java得一个重要特性,它可以获取一个类的所有信息,还可以执行类中的方法

反射赋予Java动态特性

我个人感觉静态语言的安全性是比较高的,因为一个供给使用的静态语言的程序的结构时固定的,能给攻击者能操控影响应用程序的点就十分稀少。而相对应的动态语言的灵活性好,结构也好改变,攻击者的攻击手段也就更多。所以初步感觉Java的安全问题或多或少都受反射影响
静态语言与动态语言
  • 动态语言:是一类在 运行时可以改变自身结构或者变量类型的语言,或者说这一类 语言的结构是在 运行时才被决定的。其中的结构包括但不限于:函数、对象、代码块
代表语言:Javascript C# PHP Python
  • 静态语言:是一类在 运行时不能改变自身结构或者变量类型的语言,也就是说这种 语言的结构运行之前就被决定了。
代表语言:C C++

Java作为一种静态语言,之所以拥有动态特性,就是因为有反射机制的存在

Java可以通过反射来不定化一段代码

public void execute(String className, String methodName) throws Exception {
 Class clazz = Class.forName(className);
 clazz.getMethod(methodName).invoke(clazz.newInstance());
}

这段代码在没有确定传入的参数是什么的时候,它的功能是未知的。这就是说在编译完成时,它的功能并没完全固定,它的功能会随着不同的情况产生不定的变化。这就是我所理解的反射带给Java的动态特性。

Class类

反射是如何赋予Java动态特性的呢?、

先来了解一下Java的类加载机制

类的加载过程

一个Java源文件的执行流程主要包括两个过程

  • 编译

使用Javac 将 .java 文件编译成 .class 字节码文件

  • 运行

JVM来运行.class字节码文件

而类加载过程指的就是 JVM 把.class字节码文件里的信息加载到内存中,并生成对象的过程

类加载又分成三个阶段:加载、连接、初始化

了解类加载过程之前,先简单了解一下Java内存模型

Java内存模型

Java内存中可以简单了解三个关键分区

  • 方法区

线程共享,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

堆的作用是存放对象实例数组

  • 方法栈

每个线程会有一个私有的栈。每个线程中方法的调用又会在本栈中创建一个栈帧。在方法栈中会存放编译期可知的各种基本数据类型(存具体数值)、对象引用(可以理解成指针,存对象在堆里面的具体地址)

它们之间的关系可以简单理解成如下图所示

现在来了解一下类加载的详细过程

  • 加载:将字节码加载到内存中,并将静态数据转换成成方法区的运行时数据结构,然后生成唯一一个代表这个类的

java.lang.Class对象在堆中,之后就可以通过这个Class对象来访问方法区的静态数据

  • 连接:将Java类的二进制代码合并到JVM运行状态之中的过程
    • 验证:确保加载的类信息符合JVM规范,没有安全问题
    • 准备:为类中的静态字段分配内存,并设置默认的初始值,比如int类型初始值是0。被final修饰的static字段不会设置,因为final在编译的时候就分配了
    • 解析:将常量池内的符号引用转换为直接引用的过程
  • 初始化:初始化就是执行类的构造器方法init()的过程。这个方法不需要定义,是javac编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并来的。若该类具有父类,jvm会保证父类的init先执行,然后再执行子类的init

现在,已经大致了解了Java的类加载过程,继续来看看Java是通过什么东西来实现类加载的。

类加载器

Java 中类加载是通过类加载器实现的,在Java中类加载器可以分为4种

  • 引导类加载器 Bootstap Classloader:使用C++编写,没有父类加载器,是JVM自带的类加载器,负责加载Java平台核心库,用来装载核心类库。无法直接过去
  • 扩展类加载器 Extension Classloader:使用Java编写,父类加载器是引导类加载器,java.ext.dirs目录中加载类库,或者从JDK安装目录:jre/lib/ext目录下加载类库。我们就可以将我们自己的包放在以上目录下,就会自动加载进来了
  • 应用程序类加载器 Application Classloader:使用Java编写,父类加载器是扩展类加载器 ,它负责加载环境变量classpath或者系统属性java.class.path指定路径下的类库
  • 自定义加载器:自己定义的加载器
双亲委派机制
  1. 如果一个类加载器接收到了类加载的请求,它自己先检查是否加载过,如果没有加载过而且它有父类加载器,会把这个请求委托给父类加载器去执行,一直委托到启动类加载器:Bootstrap ClassLoader
  2. 如果父类加载器可以完成加载任务,就返回成功结果,如果父类加载不了,就由子类自己去尝试加载,如果子类加载失败就会抛出ClassNotFoundException异常,这就是双亲委派模式

通过Class对象获取类的信息

Class提供了一些函数来获取类的信息

  • getName():获得包名+类名 ,返回 String
  • getSimpleName():获得类名,返回 String
  • getFeields():获得public标识的属性,返回 Field[]
  • getDeclaredFields():获得所有属性 ,返回Field[]
  • getMethod():获得本类及其父类的public方法,返回Menthod[]
  • getDeclaredFields():获得本类所有方法,返回Menthod[]

...

获取Class类方法

  • obj.getClass() 如果上下⽂中存在某个类的实例 obj ,那么我们可以直接通过 obj.getClass() 来获取它的类
  • Test.class 如果你已经加载了某个类,只是想获取到它的 java.lang.Class 对象,那么就直接 拿它的 class 属性即可。这个⽅法其实不属于反射。
  • Class.forName 如果你知道某个类的名字,想获取到这个类,就可以使⽤ forName 来获取

更多推荐

java高级:注解

目录认识注解&自定义注解元注解解析注解注解的应用场景认识注解&自定义注解注解和反射一样,都是用来做框架的,我们这里学习注解的目的其实是为了以后学习框架或者做框架做铺垫的。先来认识一下什么是注解?Java注解是代码中的特殊标记,比如@Override、@Test等,作用是:让其他程序根据注解信息决定怎么执行该程序。比如:

【Powershell 】(Windows下)常用命令 | 命令别名 | 运行Windows命令行工具 | 运行用户程序(vim、gcc、gdb)

微软官方Powershell文档:https://learn.microsoft.com/zh-cn/powershell/命令详细说明,在PDF的最后面:一、Powershell及命令简介1.1命令格式1.2命令的别名二、cmdlet别名三、cmdlet分类介绍3.1基础命令1.Get-Command2.Get-He

什么是Web浏览器的缓存机制?如何控制和清除浏览器缓存?

聚沙成塔·每天进步一点点⭐专栏简介⭐Web浏览器的缓存机制⭐浏览器缓存的工作原理⭐控制和清除浏览器缓存控制缓存⭐清除缓存⭐写在最后⭐专栏简介前端入门之旅:探索Web开发的奇妙世界欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是

JVM面试题(三)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言二、java中垃圾收集的方法有哪些?1.标记-清除:2.复制算法:3.标记-整理4.分代收集三、java内存模型四、简述java类加载机制?五、类加载器双亲委派模型机制?六、什么是类加载器,类加载器有哪些?七、简述java内存分配与回收策率以及

[echarts] 两侧堆叠柱状图

http://echarts.zhangmuchen.top/#/detail?cid=xOQSXIOQiKconstmyData=['福田区','罗湖区','南山区','盐田区','宝安区','龙岗区','坪山区','龙华区','光明区','大鹏区'];//全彩屏,双基色屏,简易屏,条形屏constoffLine=[

大型游戏动作竞技游戏开发和体感VR/AR游戏开发:创造引人入胜的虚拟世界

大型游戏动作竞技游戏和体感VR/AR游戏都代表了游戏开发领域的最新趋势。它们提供了高度沉浸式的娱乐体验,结合了视觉、听觉和体感互动。在本文中,我们将探讨如何开发这两种类型的游戏,并介绍其关键特点和开发流程。大型游戏动作竞技游戏的特点高品质图形:这些游戏通常具有引人入胜的3D图形,精美的场景和角色模型。多人在线模式:大多

运维:Powershell面向对象编程简介

运维/powershellPowershell面向对象编程简介作者:李俊才(jcLee95):https://blog.csdn.net/qq_28550263邮箱:291148484@163.com本文地址:https://blog.csdn.net/qq_28550263/article/details/13287

Day46:项目-购物车案例

购物车案例准备工作首页默认加载,其余页面懒加载调用defineStore方法构建store入口main做对应配置,找指南,快速开始,把elementplus引入进来import{createApp}from"vue";import{createPinia}from"pinia";import"./style.css";

微信小程序——生命周期详解(代码解读)

✅作者简介:2022年博客新星第八。热爱国学的Java后端开发者,修心和技术同步精进。🍎个人主页:JavaFans的博客🍊个人信条:不迁怒,不贰过。小知识,大智慧。💞当前专栏:微信小程序学习分享✨特色专栏:国学周更-心性养成之路🥭本文内容:微信小程序——使用Vant组件实现Popup弹出层(各位置弹出详细代码分

卷积神经网络(一)

文章目录前言卷积层多通道池化层代码前言从外行者角度看卷积神经网络会说无非就是卷积层后面跟着一个池化层,但是深入代码实际编写卷积神经网络总是有些困难的。其中包括各种细节比如数据格式、尺寸变化、运算规定等。参考:{{Citejournal|last1=Zhang|first1=Aston|last2=Lipton|firs

tcp_v4_connect函数的解析

源码:inttcp_v4_connect(structsock*sk,structsockaddr*uaddr,intaddr_len){//解析输入的地址结构structsockaddr_in*usin=(structsockaddr_in*)uaddr;//获取TCP协议栈的全局death_row对象structi

热文推荐