Servlet&Filter&Listener&Mybatis&预编译&生命周期

发布时间:2023年12月21日

目录

0x00 前言

0x01 Servlet&路由&生命周期

0x02 JDBC&Mybatis

0x03 预编译 SQL

0x04 Filter 过滤器

0x05 Listener 监听器


0x00 前言

很久没有更新 CSDN 博客了,原因是搭建了个人博客网站,但现在决定还是同步到 CSDN

希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢!?

个人博客链接:CH4SER的个人BLOG – Welcome To Ch4ser's Blog

0x01 Servlet&路由&生命周期

参考:JAVAEE的核心-Servlet_javaee servlet-CSDN博客
1、解释

Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

使用 Servlet 可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

2、创建和使用 Servlet

  • 第一步,创建一个类继承 HttpServlet
  • 第二步,在 web.xml 配置 Servlet 路由,或者使用 @WebServlet 配置(后面的 Filter、Listener 对应 @WebFilter、@WebListener)
  • 第三步,写入内置方法(init、service、destroy、doGet、doPost ......)

关于 web.xml:

  • ?web.xml 是 web 应用的配置文件,它必须存放在 webapp/WEB-INF/ 目录下面
  • 用于对 web 应用下的web资源进行配置,服务器在启动时会读取 web.xml 文件中的内容

关于 url-pattern 匹配模式:

  • / 代表当前web应用的根目录
  • 精确匹配,例如:/test
  • 匹配任意的url,例如:/*

以下是使用 @WebServlet 配置 Servlet 路由的示例:

以下是在 web.xml 中配置 Servlet 路由的示例:

以下是测试 doGet 方法,浏览器 GET 方式请求 http://localhost:8080/demo1/index?name=ch4ser,页面和控制台都会有打印输出。

同理,可以测试 doPut、doDelete 等方法。
3、Servlet 的生命周期

以下是测试 init、service、destroy 方法:

当浏览器 GET 方式请求 http://localhost:8080/demo1/index?name=ch4ser,IDEA 控制台输出:

---------Init---------
---------Servlet Service---------
---------Http Service---------
--------doGET---------

当 Tomcat 服务器关闭时,IDEA 控制台输出:---------Destroy---------

注意上面两个不同的 service 方法:

  • service(ServletRequest req, ServletResponse res):这个方法是 Servlet 的父类 GenericServlet 中定义的方法。用于处理通用的请求和响应
  • service(HttpServletRequest req, HttpServletResponse resp):这个方法是 Servlet 的子类 HttpServlet 中定义的方法。用于处理 HTTP 请求和响应

所以,如果只需要处理通用的请求和响应,可以使用service(ServletRequest req, ServletResponse res)方法。

而如果需要处理HTTP请求和响应,可以使用service(HttpServletRequest req, HttpServletResponse resp)方法,它提供了更多的HTTP相关的功能和信息。

0x02 JDBC&Mybatis

1、原生态数据库开发:JDBC

参考:JavaEE-JDBC基础 - 简书 (jianshu.com)

JDBC:由 Java 提供,用于访问数据库的统一 API 接口规范。
数据库驱动:由各个数据库厂商提供,用于访问数据库的 jar 包(JDBC的具体实现),遵循 JDBC 接口,以便 Java 程序员使用。

使用 JDBC 操作数据库:

  • 注册数据库驱动
  • 建立数据库连接
  • 创建 Statement 执行SQL语句
  • 输出查询 ResultSet
  • 关闭连接,释放资源

以下是一段使用 JDBC 操作数据库的简单代码:

2、持久层框架 Mybatis

MyBatis是一种持久层框架,用于将Java对象映射到关系数据库中的数据。它提供了一种将SQL语句与Java对象进行映射的简单方法,从而减少了开发人员编写和维护传统JDBC代码的工作量。

MyBatis的核心是一个基于XML的配置文件,其中定义了数据库连接信息、SQL语句和结果映射规则。开发人员可以通过编写简单的XML文件来定义SQL语句,并在Java代码中使用MyBatis的API来执行这些SQL语句。

MyBatis提供了丰富的功能,包括动态SQL、批处理、缓存、插件扩展等。它支持多种数据库,包括MySQL、Oracle、SQL Server等。同时,MyBatis还提供了与Spring等常用框架的集成支持,使得在企业应用中使用MyBatis变得更加方便。

总的来说,MyBatis是一种简单易用、功能丰富的Java持久层框架,可以帮助开发人员更轻松地进行数据库访问操作。

0x03 预编译 SQL

1、预编译原理

提前编译好执行逻辑或语义,攻击者所注入的语句并不会改变原有的逻辑或语义,从而预防 SQL 注入。

2、写法示例

3、不安全的写法和预编译写法的对比

        //不安全写法
        String unsafe_sql = "select * from stu where id="+s;
        Statement statement = connection.createStatement();
        ResultSet rs = statement.executeQuery(unsafe_sql);
        //预编译写法
        String safe_sql = "select * from stu where id=?";
        PreparedStatement preparedStatement = connection.prepareStatement(safe_sql);
        preparedStatement.setString(1,s);
        ResultSet rs = preparedStatement.executeQuery();

0x04 Filter 过滤器

1、解释

Filter 被称为过滤器,实质上就是对 Web 资源进行拦截,做一些处理后再交给下一个过滤器或 Servlet 处理。

通常是用来拦截 Request 请求进行拦截处理的,但也可以对返回的 Response 进行拦截处理。

开发人员使用 Filter 技术,可以实现对所有 Web 资源的管理,如实现权限访问控制、过滤敏感词汇、压缩响应信息等。

在讲如何创建和使用 Filter 之前,先来看看完整的请求、响应的过程:

2、Filter 生命周期

下面通过一段 Servlet 和一段 Filter 代码来验证一下 Filter 的生命周期。

这是 Servlet 的代码:

这是 Filter 的代码:

这是 web.xml 的配置:

验证结果:

  • 当中间件(项目)启动时,IDEA 控制台输出 "xss过滤开启",也就是 init 方法
  • 当中间件(项目)停止时,IDEA 控制台输出 "xss过滤销毁",也就是 destroy 方法
  • 当访问 /test 时,IDEA 控制台输出 "xss正在过滤",也就是 doFilter 方法

这里 Filter 是 implements 而不是 extends,以下是二者的区别:

  • implements 关键字用于实现接口,继承类需要实现接口中定义的所有方法
  • extends 关键字用于继承类,继承类可以使用父类的方法和属性,并可以添加新的方法和属性

但此时访问 /test?code=xxx,发现页面并没有输出 xxx,这是由于我们没有在 doFilter 方法里写上放行的代码,其默认全部禁止。

3、使用 doFilter 实现简单拦截过滤

这里修改 doFilter 方法,实现一个简单的 XSS 攻击拦截过滤:接收参数值,如果没有攻击 payload 就放行,有的话则拦截。

验证结果:

  • 访问 /test?code=123,页面正常显示 code=123,也就是 doFilter 方法将其放行
  • 访问 /test?code=<script>alert(1)</script>,页面无显示,IDEA 控制台输出 "存在xss攻击",也就是 doFilter 方法将其拦截

4、使用 doFilter 实现简单身份访问控制

以下为 Servlet 的代码,模拟一个管理员界面:

以下为 Filter 的代码,根据 cookie 判断是否为管理员,若是则放行,反之则拦截:

以下是 web.xml 的配置:

验证结果:

  • cookie 无 user=admin 时,访问 /admin 被拦截,IDEA 控制台输出 "非法访问,已拦截"
  • cookie 有 user=admin 时,正常进入 /admin 页面,IDEA 控制台输出 "欢迎进入管理员界面"

5、Filter 过滤器的安全场景

  • Payload检测
  • 权限访问控制
  • 红队内存马植入,蓝队清理内存马等

内存马参考:深入浅出内存马(一) (qq.com)

0x05 Listener 监听器

1、解释

参考:JavaWeb监听器_javaweb 监听器-CSDN博客

监听器是Servlet规范中定义的一种特殊类,简单来说就是监听操作

  • 用来监听ServletContext、HttpSession和ServletRequest等域对象的创建和销毁事件
  • 用来监听域对象的属性发生修改的事件
  • 可以在事件发生前、发生后做一些必要的处理

2、使用 Listener 监听 Session 的创建、销毁

创建两个 Servlet:CreateSession、DestroySession

CreateSession 用来创建 Session:

DestroySession 用来销毁 Session:

创建一个 Listener:ListenSession,用来监听 Session 的创建、销毁

注意:配置 Listener 路由时不需要加路径,因为 Listener 不是以访问路径触发的

验证结果:

  • 访问 /cs 时,IDEA 控制台输出 "Listener监听到了Session创建",触发 Listener的 sessionCreated 方法
  • 访问 /ds 时,IDEA 控制台输出 "Listener监听到了Session销毁",触发 Listener的 sessionDestroyed 方法

3、Listen 监听器的安全场景

  • 代码审计中分析执行逻辑触发操作

  • 红队内存马植入,蓝队清理内存马等

Listen 在安全方面涉及的比较少,不像 Filter 涉及的比较多,但还是有这种类型的内存马。

文章来源:https://blog.csdn.net/qq_46081990/article/details/135082289
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。