033-安全开发-JavaEE应用SQL预编译Filter过滤器Listener监听器访问控制

033-安全开发-JavaEE应用&SQL预编译&Filter过滤器&Listener监听器&访问控制

Untitled

#知识点:

1、JavaEE-JDBC-SQL预编译
2、JavaEE-HTTP-Filter过滤器
3、JavaEE-对象域-Listen监听器

演示案例:

➢JavaEE-预编译-SQL
➢JavaEE-过滤器-Filter
➢JavaEE-监听器-Listen

Untitled

Untitled

Untitled

#JavaEE-预编译-SQL原理:

提前编译好执行逻辑,你注入的语句不会改变原有逻辑!

Untitled

  1. 预编译写法: safesql 是一个预编译的 SQL 查询语句,其中 ? 是一个占位符,表示将在执行时动态替换。
  2. 使用 PreparedStatement PreparedStatementStatement 的子接口,用于执行预编译的 SQL 语句。通过调用 connection.prepareStatement(safesql) 创建一个 PreparedStatement 对象。
  3. 设置参数: 使用 setXXX 方法设置占位符的值。在这里,使用 setString(1, s) 将字符串 **s 的值设置到第一个占位符上及sql语句中的==?==。**这种方式防止了 SQL 注入攻击,因为参数值是通过预编译的方式传递的,而不是通过直接拼接字符串。
  4. 执行查询: 调用 executeQuery() 执行查询,得到 ResultSet 对象。
  5. 处理结果集: 根据业务需要,处理查询结果集的数据。
  6. 打印最终的预编译 SQL 语句(用于调试): System.out.println(safesql); 这行代码用于在控制台打印最终生成的预编译 SQL 语句。这对于调试时检查生成的 SQL 语句是否正确是有帮助的。
// 预编译写法
String safesql = "SELECT * FROM news WHERE id=?";

// 使用PreparedStatement
try (PreparedStatement preparedStatement = connection.prepareStatement(safesql)) {
    // 设置参数,防止SQL注入攻击
    preparedStatement.setString(1, s);

    // 执行查询
    ResultSet resultSet = preparedStatement.executeQuery();

    // 处理结果集...

    // 打印最终的预编译 SQL 语句(用于调试)
    System.out.println(safesql);
} catch (SQLException e) {
    e.printStackTrace();
}
  • 使用不安全写法,可以进行sql注入

    • select * from news where id=1: 这是一个正常的SQL查询,目的是从名为"news"的表中选择ID为1的记录。
    1. union: 这是SQL的关键字,用于合并两个查询的结果集。
    2. select 1,2,3,version(),user(),database(): 这是一个注入的查询,它返回了一些固定的值(1、2、3)以及数据库的版本信息(version())、当前用户(user())和当前数据库(database())的信息。

    通过将这两个查询合并,攻击者试图将恶意的查询注入到正常的查询中,从而获取数据库的敏感信息。这种类型的攻击被称为联合查询注入。

Untitled

  • 使用预编译写法,固定sql语句的逻辑,防止进行sql注入

Untitled

#JavaEE-过滤器-Filter

Untitled

Filter被称为过滤器,过滤器实际上就是对Web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,通常都是用来拦截request进行处理的,也可以对返回的 response进行拦截处理。开发人员利用filter技术,可以实现对所有Web资源的管理,例如实现权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

1、创建过滤器之前的准备

  • 创建新的项目FilterDemo1
  • 在对应的包名上,创建分类包filter与servlet
  • 在servlet下创建TestServlet ,并进行检测
  • 启动服务器,尝试进行Xss攻击,发现可以
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 从请求中获取名为 "code" 的参数值
    String code = req.getParameter("code");

    // 获取用于将输出发送回客户端的 PrintWriter 对象
    PrintWriter out = resp.getWriter();

    // 将 "code" 参数的值打印到客户端
    out.println(code);

    // 刷新 PrintWriter,确保立即发送任何缓冲的内容
    out.flush();

    // 关闭 PrintWriter 以释放资源
    out.close();
}

Untitled

Untitled

localhost:8080/FilterDemo1_war_exploded/test?code=

Untitled

2、创建过滤器

3、过滤器内置方法

  • 在对应的filter下创建XssFilter

  • 并实现Filter 接口中的所有方法

    • init doFilter destroy
    1. init(FilterConfig filterConfig):
      • 该方法在过滤器被初始化时调用,只会执行一次。
      • 用于执行一些初始化操作,例如获取配置信息等。
    2. doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain):
      • 这是过滤器的主要方法,在每次请求被过滤时都会调用。
      • doFilter 方法中的 filterChain.doFilter(request, response) 表示继续执行过滤器链,如果没有更多的过滤器,最终将调用目标资源(例如 Servlet 或 JSP)。
      • 如果在 doFilter 中不调用 filterChain.doFilter,则请求将被拦截,不会继续传递。
    3. destroy():
      • 该方法在过滤器被销毁时调用,只会执行一次。
      • 用于执行一些清理工作,释放资源等。
    @WebFilter("/test")
    public class XssFilter implements Filter {
    
        @Override
        **// 中间件启动后就自动运行**
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("xss开启过滤");
        }
    
        @Override
        **// 中间件关闭后就自动运行**
        public void destroy() {
            System.out.println("xss销毁过滤");
        }
    
        @Override
        **// doFilter 访问路由触发的方法**
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("xss正在过滤");
    
            // 过滤代码就应该在放行前
            // 如果符合就放行,不符合就过滤(拦截)
    
            // XSS过滤 接受参数值 如果有攻击payload 就进行拦截
            // 接受参数值 如果没有攻击payload 就进行放行
            **HttpServletRequest request = (HttpServletRequest) servletRequest;
            String code = request.getParameter("code");
    
            if (!code.contains("<script>")) { // 没有攻击payload
                // 放行
                filterChain.doFilter(servletRequest, servletResponse);
            } else {
                System.out.println("存在XSS攻击");
                // 继续拦截
                // 这里可以根据需要添加拦截后的处理逻辑,例如记录日志、返回错误信息等**
            }
        }
    }
    

4、过滤器触发流程

@WebFilter("/test")
<filter>
<filter-name>xssFilter</filter-name>
<filter-class>com.example.filter.xssFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>xssFilter</filter-name>
<url-pattern>/test</url-pattern>
</filter-mapping>

5、利用过滤器简单实现:cookie身份验证

  • 在servlet下创建AdminServlet,

    @WebServlet("/admin")
    public class AdminServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("欢迎进入管理员页面");
        }
    }
    

    Untitled

  • 在filter下创建AdminFileter

  • 先不加入判断获取到浏览器本身的cookie值

    Untitled

    Untitled

    @WebFilter("/admin")
    public class AdminFileter implements Filter{
        @Override
        // 过滤器初始化方法,在应用启动时执行
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("admin身份检测开启");
        }
    
        @Override
        // 过滤器销毁方法,在应用关闭时执行
        public void destroy() {
            System.out.println("admin身份检测销毁");
        }
    
        @Override
        // 过滤器核心逻辑,处理请求和响应
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
            System.out.println("admin身份检测进行");
    
            // 检测Cookie过滤
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            Cookie[] cookies = request.getCookies();
    
            // 对Cookie进行遍历获取
            for (Cookie c : cookies) {
                String cName = c.getName();    // 获取cookie名
                String cValue = c.getValue();  // 获取cookie值
                System.out.println(cName);
                System.out.println(cValue);
    
                filterChain.doFilter(servletRequest, servletResponse);
    		}
    	}
    }
    
    • 检查请求中是否包含名为 “user” 且值为 “admin” 的Cookie。如果符合条件,则放行请求;否则,输出 “非管理员访问”。

    • 相应进入管理员页面,必须先在浏览器中添加对应判断的cookie值

    • 如果对应不上则是非管理员访问,不予通过

      @Override
          // 过滤器核心逻辑,处理请求和响应
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      
              System.out.println("admin身份检测进行");
      
              // 检测Cookie过滤
              HttpServletRequest request = (HttpServletRequest) servletRequest;
              Cookie[] cookies = request.getCookies();
      
              **// 对Cookie进行遍历获取
              for (Cookie c : cookies) {
                  String cName = c.getName();    // 获取cookie名
                  String cValue = c.getValue();  // 获取cookie值
                  System.out.println(cName);
                  System.out.println(cValue);
      
                  // 检查是否包含名为 "user" 且值为 "admin" 的Cookie
                  if (cName.contains("user") && cValue.contains("admin")) {
                      // 是管理员,放行请求**
      									filterChain.doFilter(servletRequest, servletResponse);
      
                  **} else {
                      System.out.println("非管理员访问");
                      // 非管理员,可以根据需求添加相应的处理逻辑,例如重定向到登录页等**
                  }
      
              }
          }
      

    Untitled

    Untitled

    Untitled

6、过滤器安全场景

开启过滤后,发现成功拦截Xss攻击

Untitled

Payload检测,权限访问控制,红队内存马植入,蓝队清理内存马等
内存马参考:https://mp.weixin.qq.com/s/hev4G1FivLtqKjt0VhHKmw

#JavaEE-监听器-Listen

Untitled

参考:https://blog.csdn.net/qq_52797170/article/details/124023760
监听ServletContext、HttpSession、ServletRequest等域对象创建和销毁事件
监听域对象的属性发生修改的事件
监听在事件发生前、发生后做一些必要的处理

1、创建监听器

Untitled

  • 创建新的项目ListenDemo1

  • 在对应的包名上,创建分类包listenerr与servlet

  • 在servlet下创建CSession DSession,并进行检测

  • DSession一个简单的Servlet,对应一个/ds的URL映射。在收到GET请求时,它会销毁当前请求的HttpSession

    下面是对代码的注释:

    @WebServlet("/ds")
    public class DSession extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("Servlet里面销毁Session");
    
            // 销毁Session
            req.getSession().invalidate();
        }
    }
    
    
    • @WebServlet("/ds"): 通过此注解,指定了Servlet的URL映射为 “/ds”。
    • System.out.println("Servlet里面销毁Session");: 打印一条日志,说明Servlet正在销毁Session。
    • req.getSession().invalidate();: 获取当前请求的HttpSession,并调invalidate()方法使其失效,从而销毁Session。这通常会导致用户在当前会话中的状态丢失,因为Session被销毁了。
  • 这段代码是一个简单的Servlet,对应一个 /cs 的URL映射。在收到GET请求时,它会创建一个新的HttpSession

    下面是对代码的注释:

    @WebServlet("/cs")
    public class CSession extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("Servlet里面创建Session");
    
            // 创建Session
            req.getSession();
        }
    }
    
    • @WebServlet("/cs"): 通过此注解,指定了Servlet的URL映射为 “/cs”
    • System.out.println("Servlet里面创建Session");: 打印一条日志,说明Servlet正在创建Session。
    • req.getSession();: 获取当前请求的HttpSession,如果不存在**则会创建一个新的Session。**这通常会在应用程序需要使用会话状态时调用。

2、监听器内置方法

这段代码定义了一个实现 HttpSessionListener 接口的监听器类 ListenSession,用于监听HttpSession的创建和销毁事件。

下面是对代码的注释:

@WebListener
public class ListenSession implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        // 监听检测有Session创建就会执行这里
        System.out.println("监听器监听到了session创建");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        // 监听检测有Session销毁就会执行这里
        System.out.println("监听器监听到了session销毁");
    }
}

  • @WebListener: 通过此注解,标记这是一个监听器类。
  • @Override 注解用于表示下面的方法是对接口中方法的重写。
  • public void sessionCreated(HttpSessionEvent se): 当有新的 HttpSession 被创建时,这个方法会被调用。在这里,它简单地输出一条日志表示监听器检测到了session的创建。
  • public void sessionDestroyed(HttpSessionEvent se): 当一个 HttpSession 被销毁时,这个方法会被调用。在这里,它简单地输出一条日志表示监听器检测到了session的销毁。

Untitled

3、监听器触发流程

在Java Web应用中,监听器用于监控和响应特定的事件。对于监听器的触发流程,以下是一般的步骤:

@WebListener
<listener>
.......
</listener>
  1. 注册监听器:
    • 在Web应用中,你需要将监听器注册到相应的组件上。例如,在web.xml文件中配置监听器,或者使用注解(如@WebListener)标记监听器类。
  2. 事件发生:
    • 当与监听器关联的特定事件在Web应用中发生时,监听器会被触发。
  3. 调用监听器方法:
    • 监听器类中实现的相应方法(如sessionCreatedsessionDestroyed等)将被调用。这些方法包含与事件相关的信息,允许监听器执行特定的逻辑。
  4. 执行自定义逻辑:
    • 在监听器方法中,你可以编写自定义的逻辑以响应事件。这可能包括记录日志、修改数据、发送通知等。

举例来说,对于HttpSessionListener

  • 当一个新的HttpSession被创建时,sessionCreated方法将被调用。
  • 当一个HttpSession被销毁时,sessionDestroyed方法将被调用。

总的来说,监听器提供了一种在Web应用中对特定事件进行响应的机制,使开发者能够以声明性的方式处理应用的生命周期事件。

4、监听器安全场景

代码审计中分析执行逻辑触发操作,红队内存马植入,蓝队清理内存马等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/372123.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python Cloudflare 批量关闭IPv6兼容性脚本

Cloudflare免费版控制台不给关IPv6&#xff0c;需要使用API关闭&#xff0c;先从我的个人资料里面申请API令牌&#xff0c;再执行脚本 import requests import jsonheaders {X-Auth-Email:cloudflare登入账户, #输入登入账户的邮箱X-Auth-Key: Global API Key, #输入上图申请…

计算机自顶向下 Wireshark labs——DNS

如本文第2.4节所述&#xff0c;域名系统(DNS)将主机名转换为IP地址&#xff0c;在互联网基础设施中发挥着关键作用。在本实验中&#xff0c;我们将仔细研究DNS的客户端。回想一下&#xff0c;客户端在DNS中的角色相对简单—客户端向其本地DNS服务器发送查询&#xff0c;并收到响…

探索设计模式的魅力:从单一继承到组合模式-软件设计的演变与未来

设计模式专栏&#xff1a;http://t.csdnimg.cn/nolNS 在面对层次结构和树状数据结构的软件设计任务时&#xff0c;我们如何优雅地处理单个对象与组合对象的一致性问题&#xff1f;组合模式&#xff08;Composite Pattern&#xff09;为此提供了一种简洁高效的解决方案。通过本…

使用 PyTorch 构建 NLP 聊天机器人

一、说明 聊天机器人提供自动对话&#xff0c;可以帮助用户完成任务或寻求信息。随着深度学习的最新进展&#xff0c;聊天机器人正变得越来越具有对话性和实用性。这个全面的教程将利用 PyTorch 和 Python 从头开始构建聊天机器人&#xff0c;涵盖模型架构、数据准备、训练循环…

【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 状态压缩 广度优先搜索 LeetCode1494. 并行课程 II 给你一个整数 n 表示某所大学里课程的数目&#xff0c;编号为 1 到 n &#xff0c;数组 relations 中&#xff0c; relations[i] [xi, yi] 表示一个先修课的关系&am…

nginx slice模块的使用和源码分析

文章目录 1. 为什么需要ngx_http_slice_module2. 配置指令3. 加载模块4. 源码分析4.1 指令分析4.2 模块初始化4.3 slice模块的上下文4.2 $slice_range字段值获取4.3 http header过滤处理4.4 http body过滤处理5 测试和验证 1. 为什么需要ngx_http_slice_module 顾名思义&#…

配置Jenkins自动构建打包项目

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 需求说明 1、给A项目配置jenkins每2小时无条件自动构建一次&#xff0c;无论是否有代码提交。 2、给B项目配置jenkins每15分钟检…

FPGA高端项目:IMX327 MIPI 视频解码 USB3.0 UVC 输出,提供FPGA开发板+2套工程源码+技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理图像缓存UVC 时序USB3.0输出架构 6、vivado工程详解FPGA逻辑设计 7、工…

ChatGPT辅助编程,一次有益的尝试

如果大家想学习PCIe&#xff0c;搜索网上的信息&#xff0c;大概率会看到chinaaet上Felix的PCIe扫盲系列的博文 Felix-PCIe扫盲 每次看这个系列博文的时候&#xff0c;我都在想有没有什么方法可以把这个系列的博文都保存到一个pdf文件中&#xff0c;这样方便阅读。于是有了下…

异地办公必不可缺的远程控制软件,原理到底是什么?

目录 引言远程桌面连接软件的作用与重要性 基本概念与架构客户端-服务器模型网络通信协议 核心技术组件图形界面捕获与传输输入转发会话管理 性能优化策略带宽优化延迟优化 引言 远程桌面连接软件的作用与重要性 在当今这个高度数字化和网络化的时代&#xff0c;远程桌面连接软…

R语言学习case10:ggplot基础画图Parallel Coordinate Plot 平行坐标图

step1: 导入ggplot2库文件 library(ggplot2)step2&#xff1a;带入自带的iris数据集 iris <- datasets::irisstep3&#xff1a;查看数据信息 dim(iris)维度为 [150,5] head(iris)查看数据前6行的信息 step4&#xff1a;利用ggplot工具包绘图 plot5 <- ggparcoord(…

Linux目录:traceroute命令

目录 traceroute1、简介2、探测原理3、traceroute说明4、实例设置每跳探测数设置跳数探测包使用的基本UDP端口设置6789把对外发探测包的等待响应时间设置为3秒 总结 traceroute 1、简介 traceroute的主要功能是跟踪从IP网络发送到指定主机经过的网关的工具。它利用IP协议的生…

npm淘宝镜像源换新地址

新的淘宝npm镜像源地址&#xff1a;https://registry.npmmirror.com 切换新的镜像源 npm config set registry https://registry.npmmirror.com然后再执行以下操作查看是否成功 npm config list如果没安装过淘宝镜像源的&#xff0c;则直接安装 npm install -g cnpm --regi…

机器学习 - 梯度下降

场景 上一章学习了代价函数&#xff0c;在机器学习中&#xff0c;代价模型是用于衡量模型预测值与真实值之间的差异的函数。它是优化算法的核心&#xff0c;目标是通过调整模型的参数来最小化代价模型的值&#xff0c;从而使模型的预测结果更接近真实值。常见的代价模型是均方…

哪些因素会影响游戏服务器开发的性能?

在游戏开发中&#xff0c;服务器性能是一个关键因素&#xff0c;它影响着游戏的运行速度、稳定性以及玩家的游戏体验。游戏服务器需要处理大量的数据和请求&#xff0c;因此其性能受到多种因素的影响。本文将探讨影响游戏服务器开发性能的几个关键因素。 ​1、硬件资源 服务器…

互联网加竞赛 基于深度学习的目标检测算法

文章目录 1 简介2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 1 简介 &#x1f5…

PySpark(二)RDD基础、RDD常见算子

目录 RDD RDD五大特性 RDD创建 RDD算子 常见的Transformation算子 map flatMap mapValues reduceByKey groupBy filter distinct union join intersection glom groupByKey groupByKey和reduceByKey的区别 ? sortBy sortByKey 常见的action算子 countByKey…

Zoho联合知了标讯,为CRM系统加入智能招投标功能

随着我们在国内合作伙伴的名单不断扩充&#xff0c;CRM管理系统也在持续上线新功能。去年&#xff0c;Zoho联合知了标讯发布了智能招投标功能&#xff0c;集成在自己的CRM系统中&#xff0c;对有招投标需求的企业来说提供了莫大的便利。接下来&#xff0c;让我为您介绍&#xf…

【粉丝福利社】一书读懂物联网:基础知识+运行机制+工程实现(文末送书-完结)

&#x1f3c6; 作者简介&#xff0c;愚公搬代码 &#x1f3c6;《头衔》&#xff1a;华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xf…

On the Spectral Bias of Neural Networks论文阅读

1. 摘要 众所周知&#xff0c;过度参数化的深度神经网络(DNNs)是一种表达能力极强的函数&#xff0c;它甚至可以以100%的训练精度记忆随机数据。这就提出了一个问题&#xff0c;为什么他们不能轻易地对真实数据进行拟合呢。为了回答这个问题&#xff0c;研究人员使用傅里叶分析…