Java 代码审计背景
1 Java Web 基础
1.1 Servlet
1.1.1 概念
Java Servlet是一个在Web服务器或应用程序服务器上运行的程序,该程序是Web浏览器或其他HTTP客户端或HTTP客户端或HTTP服务器上的数据库或应用程序的请求之间的中间层。使用Servlet,您可以从网页表单中收集用户输入,从数据库或其他来源收集记录,并动态创建网页。
Java Servlet通常可以达到与使用CGI(公共网关接口)实现的程序相同的效果。但是,与CGL相比,Servlet具有以下优势:
表现要好得多
Servlet在Web服务器的地址空间内执行,因此它无需创建另一个单独的进程来处理每个客户端请求。
servlet是独立于平台的,因为它们是用Java编写的
服务器上的Java安全管理器执行一系列限制,以保护服务器计算机上的资源。因此,servlet是值得信赖的。
Java类库的所有功能均可用于Servlet。它可以通过插座和RMI机制与小程序,数据库或其他软件进行交互。
1.1.2 Servlet 架构

1.1.3 Servlet 生命周期
Servlet生命周期可以定义为从创建到破坏的整个过程。这是servlet的过程:
初始化servlet后调用init()方法。
Servlet调用服务()方法来处理客户端请求。 (致电Doget,Dopost和其他方法)
在销售前调用destroy()方法
最后,servlet是由JVM的垃圾收集器收集的垃圾。

1.2 JSP
1.2.1 概念
JSP全名Java服务器页面是一种动态的Web开发技术。它使用JSP标签将Java代码插入HTML Web页面。标签通常以%开头,并以%结尾。JSP是Java Servlet,主要用于实现Java Web应用程序的用户界面部分。 Web开发人员通过组合HTML代码,XHTML代码,XML元素以及嵌入式JSP操作和命令来编写JSP
JSP通过Web表单获得用户输入数据,访问数据库和其他数据源,然后动态创建Web页面。
JSP标签具有许多功能,例如访问数据库,记录用户选择信息,访问Javabeans组件等,还可以传递控制信息并在不同的网页上共享信息。
1.2.2 JSP 处理过程
与其他普通网页一样,浏览器将HTTP请求发送给服务器。Web服务器认识到这是对JSP网页的请求,并将请求传递给JSP引擎。它是通过使用URL或.JSP文件完成的
JSP引擎从磁盘加载JSP文件,并将其转换为servlet。此转换只需将所有模板文本转换为println()语句,然后将所有JSP元素转换为Java代码
JSP引擎将Servlet编译成可执行的类,并将原始请求传递给Servlet Engine
Web服务器的组件将调用Servlet Engine,然后加载并执行Servlet类。在执行过程中,Servlet生成HTML形式的输出,并将其嵌入HTTP响应网络中,然后将其交给Web服务器。
Web服务器将Web响应返回到浏览器作为静态HTML页面
最终,Web浏览器处理在Web响应中动态生成的HTML页面,就好像它正在处理静态网页一样。

1.2.3 JSP 的生命周期
编译阶段:Servlet容器编译源文件并生成Servlet类JSP引擎将检查是否需要编译
初始化阶段:加载与JSP相对应的类,创建其实例,并调用其初始化方法
jsplnit()
执行阶段:调用与JSP相对应的Servlet实例的服务方法
jspservice()
销毁阶段:调用与JSP相对应的Servlet实例的破坏方法,然后销毁Servlet实例
jspdestroy()
1.3 Filter
1.3.1 概念
Servlet过滤器可以动态拦截请求和响应,以转换或使用请求或响应中包含的信息。一个或多个servlet过滤器可以连接到servlet或一组servlet。 Servlet过滤器也可以连接到Javaserver页面(JSP)文件和HTML页面。在调用servlet之前,请致电所有其他过滤器。
Servlet过滤器是可用于编程的Java类,可以实现以下目的:
在访问后端资源之前,请拦截客户端的请求。
在将服务器的响应发送回客户端之前处理这些响应。
1.3.2 Filter 方法
public void doFilter(ServletRequest, ServletRespor, FilterChain)此方法完成了实际的过滤操作。当客户端请求与过滤器设置匹配的URL时,Servlet容器将首先调用过滤器的Dofilter方法。过滤器链用户访问后续过滤器。public void init(FilterConfig filterConfig)启动Web应用程序时,Web服务器将创建一个过滤器的实例对象,并调用其INIT方法读取Web.xml配置以完成对象的初始化功能,从而为后续用户请求做准备(仅创建一次过滤器对象,并且只能执行INIT方法一次)。开发人员可以通过INIT方法的参数获得代表当前过滤器配置信息的对象。
public void destroy()Servlet容器在销毁Servlet过滤器消耗资源的过滤器实例之前调用此方法。
1.4 Listener
侦听器用于聆听某些对象和信息创建,破坏,加法,修改,删除,删除和其他操作的发生,然后做出相应的响应。当范围对象的状态发生变化时,服务器会自动调用侦听器对象中的方法。根据聆听的对象,可以将其分为:
ServletContext对象侦听器
httpsession对象侦听器
ServletRequest对象侦听器
前两个不适合作为内存Webshells,因为它们涉及服务器的起点和停止,或者的建立和破坏,并且注意力集中在第三种类型的聆听请求上。其中,ServletRequestListener最适合Webshell,因为我们可以通过GetServletRequest()函数获得每个请求的事件:ServletRequestEvent,您可以获取此请求的请求对象,从而添加我们的恶意逻辑。
2 SSH 框架
2.1 MVC
MVC模型是软件工程中的软件体系结构模型,该模型将软件系统分为三个基本部分:模型(模型),视图(视图)和控制器(控制器)。MVC模型的目的是实施动态编程,简化程序的后续修改和扩展,并使程序的某些部分重复使用。此外,此模式通过简化复杂性使程序结构更加直观。软件系统将其基本零件分开,同时还为每个基本部分提供应有的功能。
模型- 程序员应编写程序(实现算法等)的功能,数据库专家执行数据管理和数据库设计(可以实现特定功能)。
视图- 接口设计人员执行图形接口设计。
控制器- 负责转发请求的负责,请求的处理性能要好得多。
2.1.1 MVC 早期架构

2.1.2 MVC 现代架构

2.2 Struts2
Struts2是基于MVC设计模式的Web应用程序框架,该模式基本上等同于Servlet。但是,在J2EE的MVC设计模式中,Struts2是一个控制器,可以在模型和视图之间建立数据交互。 Struts 2基于过滤器以实现AOP的想法。2.2.1 Struts2 架构
Servlet过滤器:过滤链,客户端的所有请求必须由过滤器链处理。支柱核心:Struts2的核心处理部分。
拦截器:Struts2的拦截器。 Struts2提供了许多默认的拦截器。您还可以定义自己的拦截器来实施实际业务所需的功能。
用户创建:由开发人员创建。包含Struts.xml,动作和模板。

2.2.2 Struts2 的 MVC

2.2.3 OGNL 表达式
支持对象方法调用,例如:objname.methodname();支持静态方法调用和值的价值访问。表达式的格式为@[class full name(包括封装路径)] @[方法名称| value name]
支持分配操作和表达串联,例如:数字=18,价格=100,计算PRICE(价格*编号);然后返回1800;
访问OGNL上下文(OGNLContext)是Struts2中的ActionContext;
操作(创建)收集对象
2.3 Spring
方便的解耦和简化的开发(高内聚力和低耦合)。 Spring是一个大型工厂(IOC容器),可以创建所有对象并维护春季管理的依赖性。春季工厂用于生成豆类。提供面向面的(AOP)编程。 Spring可以方便地实现程序上的权限拦截,操作监控和其他功能。
方便地整合各种出色的框架。 Spring并不排除各种出色的开源框架,它为各种出色的框架(例如Struts.Hibernate。Mybatis等)提供了直接的支持。
减少使用Javaee API的困难。 Spring为某些API提供了封装,这些API在Javaee开发中很难使用(JDBC,Javamail,远程呼叫等),这大大减少了应用这些API的困难。
2.3.1 Spring 核心概念 - IoC
IOC是控制反转的缩写,大多数书籍被翻译为“控制逆转”。为了解决对象之间过度耦合的问题,软件专家迈克尔马云惹不起马云马特森(Michael Mattson)提出了IOC理论以实现对象之间的脱钩。2004年,马丁马云惹不起马云福勒(Martin Fowler)讨论了同样的问题。由于IOC是控制的逆转,因此“控制的哪些方面已逆转?”经过详细的分析和演示,他提出了一个答案:“获得依赖对象的过程已经逆转。”在控制控件后,获得相关对象的过程从其自身的管理变为IOC容器的主动注入。因此,他给了“控制反转”一个更合适的名称“依赖注入”。
他的答案实际上提供了实施IOC:注入的方法。所谓的依赖注入是IOC容器在操作过程中动态注入一定的依赖关系。依赖注入(DI)和对照反转(IOC)是从不同角度描述的相同的内容,它是指通过引入IOC容器和使用依赖注入对象之间的对象之间的解耦。
2.3.2 IoC 优点

2.3.3 Spring 核心概念 - Bean
Spring Bean是通过弹簧IOC容器实例化,组装和管理的对象。弹簧豆是任何春季应用程序的基本构建块。大多数应用程序的逻辑代码将放置在Spring Bean中。
春豆管理包括:
创建一个对象
提供依赖项(例如其他豆类,配置属性)。
拦截对象方法调用以提供其他框架功能。
销毁一个物体
定义春豆的三种不同方法:
用construct @component注释(或其导数)注释类
编写一种在自定义Java配置类中使用@BEAN注释的Bean Factory方法。
在XML配置文件中声明BEAN定义
2.4 Hibernate
2.4.1 定义
Hibernate是Gavin King在2001年创建的开源代码的ORM(object_Relative映射)框架。它是Java对象和数据库服务器之间的桥梁。它在Java对象和关系数据库之间建立了一定的映射,以直接访问Java对象,并从不断的公共数据编程工作中解放了开发人员。
2.4.2 ORM
ORM-对象关系映射,ORM专注于数据库中对象和列之间的关系3 SSM 框架
3.1 MVC

3.2 Spring MVC
Spring MVC是弹簧框架的后续产品,已集成到春季Web流中。弹簧框架为构建Web应用程序提供了功能齐全的MVC模块。使用Spring的可插入MVC体系结构,因此,当将Spring用于Web开发时,您可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,例如Struts1(通常使用)(通常使用),Struts2(通常用于旧项目),等等。春季MVC目前已成为最主流的MVC框架之一。自春季3.0发行以来,它已经超过了Struts2,并成为了最好的MVC框架。它使用一组注释将简单的Java类制作用于处理请求的控制器而无需实现任何接口。它还支持恢复的编程风格请求。
3.3 Spring MVC 执行流程

3.4 Spring MVC 与 Struts 2 的对比
3.4.1 框架机制
Struts2使用过滤器实现,而Spring MVC则使用Servlet实现。启动容器后初始化过滤器;该服务比servlet晚崩溃。 servlet在调用时将初始化,在过滤器之前调用并在停止服务后被销毁。
基于Spring MVC方法的截距,单身模式豆注射一次。 Struts2是一个级别的拦截器。每当对相应实例请求新操作时,所有属性值注入都需要加载。因此,春季MVC的开发效率和性能高于Struts2。
Struts 2更符合AOP的编程想法,Spring MVC更加谨慎,并且会扩展在servlet上。
3.4.2 拦截机制
Struts2Struts2框架是一个级别的拦截器。每个请求都是创建的。与Spring集成时,Struts2的Action Bean注入范围是原型模式原型,然后通过setter和getter将请求数据注入属性中。
在Struts2中,操作对应于请求和响应上下文。接收参数时,可以通过属性接收它们,这意味着属性参数通过多种方法共享。
Struts2中的一种动作方法可以对应于URL,但是其类属性均由所有方法共享,因此无法通过注释或其他方法来识别它。
SpringMVC
Spring MVC是一种方法级拦截器。一种方法对应于请求上下文,因此该方法基本上是独立的,并且只有请求和响应数据。每个方法对应于一个URL,并且参数传输直接注入该方法,该方法是该方法所独有的。处理结果通过调制员返回到框架。
在Spring集成期间,Spring MVC的控制器BEAN默认为Singleton,因此默认情况下只能为所有请求创建一个控制器。有线程安全,因为没有共享属性。如果要更改默认范围,则需要添加@Scope注释以修改它。
3.5 Mybatis
Mybatis是一个持久的层框架,支持普通的SQL查询,存储过程和高级映射。它消除了几乎所有JDBC代码和参数的手动设置以及结果集的检索,并使用简单的XML或注释进行配置和原始映射来映射接口,Java的POJO(普通的旧Java对象)将其用于数据库中的记录,从而使Java开发人员使用对象与对象的编程构想来操作该数据库。4 Spring Boot Spring Cloud
4.1 Spring Boot
4.1.1 Spring Boot 定义
Spring Boot是弹簧开源组织下的一个子项目,也是弹簧组件的一站式解决方案。它主要是简化使用弹簧框架并简化和繁琐的配置的困难。Spring Boot为各种组件提供了起动器。只要开发人员可以配置相应的组件参数,SpringBoot将自动配置它,从而使开发人员可以快速构建依赖弹簧组件的Java项目。
Spring Boot不仅可以创建传统的战争软件包应用程序,还可以创建不依赖任何外部容器(例如Tomcat)的独立独立应用程序。可以使用Java -Jar命令开始。同时,Spring Boot提供了执行Spring脚本的命令行工具。
4.1.2 Spring Boot 特点
独立运行:包装容器并生成JAR简化Maven配置:Spring-Boot-Starter-XX
自动配置:根据当前类Path或JAR软件包的类自动配置Spring Bean。
无编码生成和XML配置:借助注释
应用程序监视:提供一系列可以监视服务和应用程序的端点,并可以对Spring应用程序进行健康测试。
4.2 Spring Cloud
4.2.1 Spring Cloud 定义
弹簧云是一系列框架的有序集合。它使用Spring Boot的开发便利性来巧妙地简化分布式系统基础架构的开发,例如服务发现注册,配置中心,消息总线,负载平衡,断路器,数据监视等,可以使用Spring Boot的开发样式启动和部署一键单击。弹簧云不会重复生产车轮。它仅结合了各种公司开发的相对成熟和实用的服务框架。它通过春季启动样式重新包装和屏蔽复杂的配置和实现原理,并最终使开发人员具有简单,易于理解,易于部署且易于维护的分布式系统开发工具包。
4.2.2 Spring Cloud Alibaba 框架
