当前位置: 首页 > 科技观察

Java安全基础之Servlet核心技术

时间:2023-03-12 13:52:40 科技观察

由于在实践中,文章更新速度可能会有点慢,JAVA安全初学者,如有不当内容,欢迎指正。今天写一下Servlet的一些核心技术。后面更新Filter后,我会把这两个做一个总结。了解Servlet知识有助于后续的框架审计。在代码审计中,我们可以选择Servlet启动,也可以选择从漏洞点推导出Http请求的入口地址。1、Servlet配置不同版本的Servlet配置不同。Servlet3.0之前的版本在web.xml中配置,Servlet3.0之后的版本使用更方便的注解来配置。另外,不同版本的Servlet需要不同版本的Java/JDK。1.1.Servlet配置-基于web.xml-声明servlet配置入口-声明servlet描述信息-定义WEB-声明Servlet名称供后续使用mapping——指定当前servlet对应的类的路径——注册组件访问配置的路径入口——指定上面配置的Servlet的名称——--指定配置该组件的访问路径2.Servlet访问流程下面以配置文件为例:首先在浏览器地址栏输入user,即访问url-pattern标签中的值,然后浏览器发起请求,服务器通过servlet-mapping标签找到文件名为user的url-pattern,通过其对应的servlet-name在servlet标签中找到具有相同servlet-name的servlet,得到servlet-通过t的模式servlet标记中的servlet-name。class参数最终得到具体的class文件路径,然后执行servlet-class标签中class文件的逻辑。从上面的流程可以看出,servlet和servlet-mapping都包含了标签。主要原因是servlet-class和url-pattern是通过servlet-name作为链接连接起来的,从而将url映射到servlet-class指定的class来执行相应的逻辑。首先在浏览器地址栏输入user,即访问url-pattern标签中的值,然后浏览器发起请求,服务器在servlet-mapping标签中找到文件名为user的url-pattern,并使用其对应的servlet-name在servlet标签中查找具有相同servlet-name的servlet,然后通过servlet标签中的servlet-name获取servlet-class参数,最后获取具体的类文件路径,然后在servlet-class标签中执行类文件的逻辑。从上面的流程可以看出,servlet和servlet-mapping都包含了标签。主要原因是servlet-class和url-pattern是通过servlet-name作为链接连接起来的,从而将url映射到servlet-class指定的class来执行相应的逻辑。3、ServletHTTP的接口方法有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对象在处理客户请求时完成一些初始化工作,比如as建立与数据库的连接,获取配置信息等。init()方法在第一次创建servlet时被调用,并且不会在每个后续用户请求时被调用。init()方法中有一个ServletConfig参数,ServletConfig表示配置信息,即web.xml中配置的信息。3.2、Servlet接口方法——service()接口service()方法是执行实际任务的主要方法,Servlet容器(即web服务器)调用service()方法处理来自客户端(浏览器)的请求,并将格式优化后的响应写回客户端,每次服务器收到servlet请求时,服务器都会生成一个新线程并调用服务。需要注意的是,在Servlet容器调用service()方法之前,必须保证init()方法正确完成。一般来说,服务方法不需要重写,因为在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方法。3.4、Servlet接口方法-其他接口destroy()接口当Servlet容器检测到一个Servlet对象应该从服务中移除时,会调用该对象的destroy()方法,使Servlet对象释放它所使用的资源,将数据保存到持久性存储设备,例如将内存中的数据保存到数据库、关闭数据库连接、停止后台线程、将cookie列表或命中计数器写入磁盘以及执行其他类似的清理活动。destroy()方法与init()方法相同,只会被调用一次。getServletConfig()接口getServletConfig()方法返回Servlet容器调用init()方法时传递给Servlet对象的ServletConfig对象。ServletConfig对象包含Servlet的初始化参数。开发者可以在Servlet配置文件web.xml中使用标签为servlet配置一些初始化参数。getServletInfo()接口getServletInfo()方法将返回一个String类型的字符串,包括有关Servlet的信息,如作者、版本和版权。4.Servlet生命周期我们常说的Servlet生命周期是指一个servlet从创建到销毁的整个过程。在一个生命周期中,一个Servlet经历了加载、初始化、接收请求、响应请求、提供服务的过程。当用户第一次向服务器发起请求时,服务器会解析用户的请求。这时容器会加载Servlet,然后创建一个Servlet实例,然后初始化servlet调用init()方法,然后调用服务的service()方法处理UserGET、POST或其他类型的请求要求。执行完Servlet中对应类文件的逻辑后,将结果返回给服务器,服务器响应用户请求。当服务器不再需要Servlet实例或重新加载servlet实例或重新加载servlet时,它会调用destroy()方法。通过该方法,Servlet可以释放在init()方法中申请的所有资源。五、总结从本质上讲,JSP是一个Servlet,因为JSP文件最终会被编译成class文件,而这个Class文件其实就是一个特殊的Servlet。SpringMVC框架基于Servlet技术。在代码审计中,我们可以选择Servlet启动,也可以选择从漏洞点推导出Http请求的入口地址。了解Servlet知识有助于后续的框架审计。