漏洞简介
漏洞编号:CVE-2021-44228
漏洞级别:0day
Apache Log4j2是一个基于Java的日志记录工具。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。
漏洞适用版本为2.0 <= Apache log4j2 <= 2.14.1,只需检测Java应用是否引入 log4j-api , log4j-core 两个jar。若存在应用使用,极大可能会受到影响。
修复方法:升级Apache Log4j2所有相关应用到 >=log4j-2.15.0-rc2 版本
漏洞原理
当log4j打印的日志内容中包含${jndi:ldap://ip}时,服务端程序就会通过ldap协议访问ip这个地址,若访问的是一个包含java代码的class文件的地址,程序会通过此地址下载class文件并在服务端主机执行class文件中的 ...
方法区方法区的定义
jvm中存储对象类型信息的地方,是jvm重要的组成部分之一。
方法区的存储内容
1.类型信息(域信息,方法信息)
2.运行时常量池
3.静态变量
4.JIT代码缓存
版本更迭变化对比
版本
内容
JDK1.6及以前
方法区的具体实现为永久代,永久代和堆相互隔离,为虚拟机内的一块内存。大小在启动JVM时可以设置一个固定值,不可变;
JDK1.7
依然存在永久代,但是已经开始去除永久代,将字符创常量池以及静态变量存储在堆中
JDK1.8及以后
方法区的具体实现变为元空间,元空间使用的是本地内存,存储类型信息,常量,方法,字段。字符串常量池和静态变量依然在堆中
为什么将永久代替换为元空间
1.为永久代设置空间大小比较困难不好判断要为永久代设置多大的空间,如果动态加载的类比较多,容易产生OOM,设置的比较小又会频繁发生FULL GC导致STW时间变长,设置的过大又比较浪费。元空间使用的是本地内存,maxMetaspaceSize默认值为-1,随便用。
2.对永久代调优是很困难的永久代的垃圾回收主要回收的是常量以及不再使用的类型信息常量没人用了就回 ...
CPU使用率低负载高的原因分析总结
产生的原因一句话总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低。
在分析负载为什么高之前先引进负载、多任务操作系统、进程调度等相关概念。
负载
负载:负载就是cpu在一段时间内正在处理以及等待cpu处理的进程数之和的统计信息,也就是cpu使用队列的长度统计信息,这个数字越小越好(如果超过CPU核心*0.7就是不正常)
负载分为两大部分:CPU负载、IO负载
例如,假设有一个进行大规模科学计算的程序,虽然该程序不会频繁地从磁盘输入输出,但是处理完成需要相当长的时间。因为该程序主要被用来做计算、逻辑判断等处理,所以程序的处理速度主要依赖于cpu的计算速度。此类cpu负载的程序称为“计算密集型程序”。
还有一类程序,主要从磁盘保存的大量数据中搜索找出任意文件。这个搜索程序的处理速度并不依赖于cpu,而是依赖于磁盘的读取速度,也就是输入输出(input/output,I/O).磁盘越快,检索花费的时间就越短。此类I/O负载的程序,称为“ ...
JavaWeb 中的 Cookie 介绍和使用概述Java Web 中的 Cookies 用于在客户端和服务器之间建立会话,使服务器能够记住客户端跨多个请求-响应对。
关键类和方法
主要类:java.net 包中的 CookieHandler。
辅助类:CookieManager、CookiePolicy、CookieStore、HttpCookie。
CookieManager:管理完整的 Cookie 框架,包括 CookiePolicy 和 CookieStore。
CookiePolicy:定义接受和拒绝 Cookies 的规则。
创建 CookieString name = "Cookie 名称";String value = "Cookie 值";Cookie cookie = new Cookie(name, value);response.addCookie(cookie);
这将向客户端发送 HTTP 头部,将 Cookie 存储在用户的计算机上。
额外的 Cookie 属性
setComment(String):描述 Co ...
集合的概述(重点)
集合的由来
当需要在Java程序中记录单个数据内容时,则声明一个变量。
当需要在Java程序中记录多个类型相同的数据内容时,声明一个一维数组。
当需要在Java程序中记录多个类型不同的数据内容时,则创建一个对象。
当需要在Java程序中记录多个类型相同的对象数据时,创建一个对象数组。
当需要在Java程序中记录多个类型不同的对象数据时,则准备一个集合。
集合的框架结构
Java中集合框架顶层框架是:java.util.Collection集合 和 java.util.Map集合。
其中Collection集合中存取元素的基本单位是:单个元素。
其中Map集合中存取元素的基本单位是:单对元素。
Collection集合(重点)
基本概念
java.util.Collection接口是List接口、Queue 接口以及Set接口的父接口,因此该接口里定义的方法既可用于操作List集合,也可用于操作Queue集合和Set集合。
常用的方法(练熟、记住)
方发声明
功能介绍
boolean add(E e);
向集合中添加对象
boolean ...
可变字符串类(重点)
基本概念
由于String类描述的字符串内容是个常量不可改变,当需要在Java代码中描述大量类似的字符串时,只能单独申请和存储,此时会造成内存空间的浪费。
为了解决上述问题,可以使用java.lang.StringBuilder类和java.lang.StringBuffer类来描述字符序 列可以改变的字符串,如:”ab”。
StringBuffer类是从jdk1.0开始存在,属于线程安全的类,因此效率比较低。
StringBuilder类是从jdk1.5开始存在,属于非线程安全的类,效率比较高。
StringBuilder类常用的构造方法
方法声明
功能介绍
StringBuilder()
使用无参方式构造对象,容量为16
StringBuilder(int capacity)
根据参数指定的容量来构造对象,容量为参数指定大小
StringBuilder(String str)
根据参数指定的字符串来构造对象,容量为:16+字符串长度
StringBuilder类常用的成员方法
方法声明
功能介绍
int capacity()
用 ...
常用的包(熟悉)
包的名称和功能
java.lang包 - 该包是Java语言的核心包,并且该包中的所有内容由Java虚拟机自动导入。 如:System类、String类、…
java.util包 - 该包是Java语言的工具包,里面提供了大量工具类以及集合类等。 如:Scanner类、Random类、List集合、…
java.io包 - 该包是Java语言中的输入输出包,里面提供了大量读写文件相关的类等。 如:FileInputStream类、FileOutputStream类、…
java.net包 - 该包是Java语言中的网络包,里面提供了大量网络编程相关的类等。 如:ServerSocket类、Socket类、…
java.sql 包 - 该包是Java语言中的数据包,里面提供了大量操作数据库的类和接口等。 如:DriverManager类、Connection接口、…
Java程序员在编程时可以使用大量类库,因此Java编程时需要记的很多,对编程能力本身要求不是特别的高
Object类的概述(重点)
基本概念
java.lang.Object类是Java语言 ...
String类的概念(重点)
java.lang.String类用于描述字符串,Java程序中所有的字符串字面值都可以使用该类的对象加描 述,如:”abc”。
该类由final关键字修饰,表示该类不能被继承。
从jdk1.9开始该类的底层不使用char[]来存储数据,而是改成 byte[]加上编码标记,从而节约了一 些空间。
该类描述的字符串内容是个常量不可更改,因此可以被共享使用。 如:
String str1 = “abc”; - 其中"abc"这个字符串是个常量不可改变。str1 = “123”; - 将“123”字符串的地址赋值给变量str1。 - 改变str1的指向并没有改变指向的内容
常量池的概念(原理)
由于String类型描述的字符串内容是常量不可改变,因此Java虚拟机将首次出现的字符串放入常量 池中,若后续代码中出现了相同字符串内容则直接使用池中已有的字符串对象而无需申请内存及创建对象,从而提高了性能。
常用的构造方法(练熟、记住)
方法声明
功能介 ...
正则表达式的概念(了解)
正则表达式本质就是一个“规则字符串”,可以用于对字符串数据的格式进行验证,以及匹配、查 找、替换等操作。该字符串通常使用^运算符作为开头标志,使用$运算符作为结尾标志,当然也可以省略。
正则表达式的规则(了解)
正则表达式
说明
[abc]
可以出现a、b、c中任意一个字符
[^abc]
可以出现任何字符,除了a、b、c的任意字符
[a-z]
可以出现a、b、c、……、z中的任意一个字符
[a-zA-Z0-9]
可以出现az、AZ、0~9中任意一个字符
正则表达式
说明
.
任意一个字符(通常不包含换行符)
\d
任意一个数字字符,相当于[0-9]
\D
任意一个非数字字符
\s
空白字符,相当于[\t\n\x0B\f\r]
\S
非空白字符
\d
任意一个单词字符,相当于[a-zA-Z_0-9]
\W
任意一个非单词字符
正则表达式
说明
X?
表示X可以出现一次或一次也没有,也就是0 ~ 1次
X*
表示X可以出现零次或多次,也就是0 ~ n次
X+
表示X可以出现 ...