2

Java安全基础之Servlet核心技术

 1 year ago
source link: https://www.51cto.com/article/720393.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Java安全基础之Servlet核心技术

作者:cynicism 2022-10-11 08:37:43
不同的版本的Servlet配置不同,Servlet3.0之前的版本都是在web.xml中配置的,而Servlet3.0之后的版本则使用更为便捷的注解方式来配置。此外,不同版本的Servlet所需的Java/JDK版本也不相同。

因为在实习中,文章更新速度可能有点慢,初学JAVA安全,内容如有不恰当的地方,欢迎各位大佬指正。

今天写一下Servlet的一些核心技术,后面更新完Filter之后我会对这两个进行一个总结。

了解Servlet知识对后续的框架审计有一定的帮助。代码审计中我们可以选择Servlet入手,也可以选择从漏洞点反推出Http请求的入口地址。

一、Servlet的配置

不同的版本的Servlet配置不同,Servlet3.0之前的版本都是在web.xml中配置的,而Servlet3.0之后的版本则使用更为便捷的注解方式来配置。此外,不同版本的Servlet所需的Java/JDK版本也不相同。

11ef83a79f4b44fb7592192a868837d5beaa90.jpg

1.1、Servlet的配置-基于web.xml

<servlet>—— 声明servlet配置入口
<description>—— 声明servlet描述信息
<display-name>——— 定义WEB
<servlet-name>—— 声明Servlet名称以便在后面的映射时使用
<servlet-class>—— 指定当前servlet对应的类的路径
<servlet-mapping>—— 注册组件访问配置的路径入口
<servlet-name>—— 指定上文配置的Servlet的名称
<url-pattern>—— 指定配置这个组件的访问路径
889a6eb64c265a39f8e6297e063b0709016299.jpg

二、Servlet的访问流程

我们以如下的配置文件举例:

077e62896b5510d73e618902757f203754c8db.jpg

首先在浏览器地址栏中输入user,即访问url-pattern标签中的值,然后浏览器发起请求,服务器通过servlet-mapping标签中找到文件名为user的url-pattern,通过其对应的servlet-name寻找servlet标签中servlet-name相同的servlet,再通过servlet标签中servlet-name,获取servlet-class参数,最终得到具体的class文件路径,继而执行servlet-class标签中class文件的逻辑。

从上述过程中可以看出,servlet和servlet-mapping中都含有<servlet-name></servlet-name>标签,其主要原因是通过servlet-name作为纽带,将servlet-class和url-pattern构成联系,从而使url映射到servlet-class所指定的类中执行相应逻辑。

c57be82418e3674f93296167ff64884264ad10.jpg

首先在浏览器地址栏中输入user,即访问url-pattern标签中的值,然后浏览器发起请求,服务器通过servlet-mapping标签中找到文件名为user的url-pattern,通过其对应的servlet-name寻找servlet标签中servlet-name相同的servlet,再通过servlet标签中servlet-name,获取servlet-class参数,最终得到具体的class文件路径,继而执行servlet-class标签中class文件的逻辑。

从上述过程中可以看出,servlet和servlet-mapping中都含有<servlet-name></servlet-name>标签,其主要原因是通过servlet-name作为纽带,将servlet-class和url-pattern构成联系,从而使url映射到servlet-class所指定的类中执行相应逻辑。

37268d140e1f8976bea4316c1a7becae20b673.jpg

三、Servlet的接口方法

HTTP有8中请求方式,分别为,GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE以及CONNECT方法.与此类似,Servlet接口中也对于着响应的请求接口:GET、POST、HEAD、PUT、DELETE、OPTIONS以及TRACE,这些接口对应着请求类型,service()方法会检查HTTP请求类型,然后在适当的时候调用doGet、doPost、doPost、doPut、doDelete等方法。

3.1、Servlet的接口方法 - init()接口

在Servlet实例化后,Servlet容器会巧用init()方法来初始化该对象,主要是为例使Servlet对象在处理客户请求钱可以完成一些初始化工作,例如建立数据库的连接,获取配置信息等。init()方法在第一次创建servlet时被调用,在后续每次用户请求时不在被调用。

在init()方法中有一个ServletConfig参数,ServletConfig代表的是配置信息,即在web.xml中配置的信息。

28e35fc32304585c1ff52080bce541436174c4.jpg

3.2、Servlet的接口方法 - service()接口

service()方法是执行实际任务的主要方法,Servlet容器(即web服务器)调用service()方法来处理来自客户端(浏览器)的请求,并将格式化的响应写回给客户端,每次服务器接收到一个servlet请求时,服务器会产生一个新的线程并调用服务。要注意的是,在service()方法被Servlet容器调用之前,必须确保init()方法正确完成。

一般来说service方法是不需要重写的,因为在HttpServlet中已经有了很好的实现,它会根据请求的方法名(GET,POST),调用doGet,doPos以及其他的doXXX方法,也就是说service是用来转向的,所以我们一般写一个servlet,只需要重写doGet或者doPost就可以了。

3.3、Servlet的接口方法 - doGet() && doPost()接口

doGet()等方法根据HTTP的不同请求调用不同的方法,如果HTTP得到一个来自URL的GET请求,就会调用doGet()方法;如果得到的是一个POST请求,就会调用doPost()方法。

在servlet中默认情况下,无论你是get还是post提交过来都会经过service()方法来处理,然后转向到doGet或者是doPost方法。

下面是自动生成的doGet()和doPost方法。

e991314982b363899d367411d341ac45d9be97.jpg

3.4、Servlet的接口方法 - 其他接口

destory()接口

当Servlet容器检测到一个Servlet对象应该从服务中被移除时,就会调用该对象的destroy()方法,以便Servlet对象释放它所使用的资源,保存数据到持久存储设备中,例如将内存中的数据保存到数据库中、关闭数据库连接、停止后台线程、把Cookie列表或点击计数器写到磁盘,并执行其他类似的清理活动。destory()方法与init()方法相同,只会被调用一次。

getServeltConfig()接口

getServletConfig()方法返回Servlet容器调用init()方法时传递给Servlet对象的ServletConfig对象,ServletConfig对象包含Servlet的初始化参数。开发者可以在Servlet的配置文件web.xml中,使用<init-param>标签为servlet配置一些初始化参数。

getServletInfo()接口

getServletInfo()方法会返回一个String类型的字符串,包括关于Servlet的信息,如作者、版本及版权等。

四、Servlet的生命周期

我们常说的Servlet生命周期指的是servlet从创建直到销毁的整个过程,在一个生命周期中,Servlet经历了被加载、初始化、接收请求、响应请求以及提供服务的过程。

98d70fc6030124212d6715b53612fb145c511c.jpg

当用户第一次向服务器发起请求时,服务器会解析用户的请求,此时容器会加载Servlet,然后创建Servlet实例,再初始化servlet调用init()方法,紧接着调用服务的service()方法去处理用户GET、POST或者其他类型的请求。当执行完Servlet中对应class文件的逻辑后,将结果返回给服务器,服务器再响应用户请求,当服务器不再需要Servlet实例或重新载入servlet实例或重新载入servlet时会调用destory()方法,借助该方法,Servlet可以释放掉所以在init()方法中申请的资源。

从本质上来说JSP就是一个Servlet,因为JSP文件最终会被编译成class文件,而这个Class文件实际上就是一个特殊的Servlet

Spring MVC框架是基于Servlet技术实现的。

代码审计中我们可以选择Servlet入手,也可以选择从漏洞点反推出Http请求的入口地址。

了解Servlet知识对后续的框架审计有一定的帮助。

责任编辑:武晓燕 来源: FreeBuf.COM

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK