Day33:安全开发-JavaEE应用SQL预编译Filter过滤器Listener监听器访问控制
目录
JavaEE-预编译-SQL
JavaEE-过滤器-Filter
JavaEE-监听器-Listen
思维导图
Java知识点
功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.
框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等
技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充
安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充
安全:原生开发安全,第三方框架安全,第三方库安全等,待补充
JavaEE-预编译-SQL
预编译SQL语句并执行 , 预防SQL注入问题String safesql="select * from news where id=?";
PreparedStatement preparedStatement=connection.prepareStatement();
preparedStatement.setString(1,s);
ResultSet resultSet=preparedStatement.executeQuery();
提前编译好执行逻辑,你注入的语句不会改变原有逻辑!
- 预编译写法: safesql 是一个预编译的 SQL 查询语句,其中 ? 是一个占位符,表示将在执行时动态替换。
- 使用 PreparedStatement: PreparedStatement 是 Statement 的子接口,用于执行预编译的 SQL 语句。通过调用 connection.prepareStatement(safesql) 创建一个 PreparedStatement 对象。
- 设置参数: 使用 setXXX 方法设置占位符的值。在这里,使用 setString(1, s) 将字符串 **s 的值设置到第一个占位符上及sql语句中的==?==。**这种方式防止了 SQL 注入攻击,因为参数值是通过预编译的方式传递的,而不是通过直接拼接字符串。
- 执行查询: 调用 executeQuery() 执行查询,得到 ResultSet 对象。
- 处理结果集: 根据业务需要,处理查询结果集的数据。
- 打印最终的预编译 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的记录。
- union: 这是SQL的关键字,用于合并两个查询的结果集。
- select 1,2,3,version(),user(),database(): 这是一个注入的查询,它返回了一些固定的值(1、2、3)以及数据库的版本信息(version())、当前用户(user())和当前数据库(database())的信息。
通过将这两个查询合并,攻击者试图将恶意的查询注入到正常的查询中,从而获取数据库的敏感信息。这种类型的攻击被称为联合查询注入。
使用预编译写法,固定sql语句的逻辑,防止进行sql注入
JavaEE-过滤器-Filter
Filter被称为过滤器,过滤器实际上就是对Web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,通常都是用来拦截request进行处理的,也可以对返回的 response进行拦截处理。开发人员利用filter技术,可以实现对所有Web资源的管理,例如实现权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
1、创建过滤器
2、过滤器内置方法
init doFilter destroy
3、过滤器触发流程
@WebFilter("/xss")
<filter>
<filter-name>xssFilter</filter-name>
<filter-class>com.example.filter.xssFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>xssFilter</filter-name>
<url-pattern>/xss</url-pattern>
</filter-mapping>
4、过滤器安全场景
Payload检测,权限访问控制,红队内存马植入,蓝队清理内存马等
内存马参考:https://mp.weixin.qq.com/s/hev4G1FivLtqKjt0VhHKmw
1、创建新的项目
- 创建新的项目FilterDemo1
- 在对应的包名上,创建分类包filter与servlet
- 在servlet下创建TestServlet ,并进行检测
- 启动服务器,尝试进行Xss攻击,发现可以
2、创建过滤器
在对应的filter下创建XssFilter,并实现Filter 接口中的所有方法
3、过滤器内置方法
init(FilterConfig filterConfig):
- 该方法在过滤器被初始化时调用,只会执行一次。
- 用于执行一些初始化操作,例如获取配置信息等。
doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain):
- 这是过滤器的主要方法,在每次请求被过滤时都会调用。
- doFilter 方法中的 filterChain.doFilter(request, response) 表示继续执行过滤器链,如果没有更多的过滤器,最终将调用目标资源(例如 Servlet 或 JSP)。
- 如果在 doFilter 中不调用 filterChain.doFilter,则请求将被拦截,不会继续传递。
destroy():
- 该方法在过滤器被销毁时调用,只会执行一次。
- 用于执行一些清理工作,释放资源等。
package com.example.filterdemo1.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import java.io.IOException;@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 {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("欢迎进入管理员页面");} }
在filter下创建AdminFileter,先不加入判断获取到浏览器本身的cookie值
- 检查请求中是否包含名为 “user” 且值为 “admin” 的Cookie。如果符合条件,则放行请求;否则,输出 “非管理员访问”。
- 相应进入管理员页面,必须先在浏览器中添加对应判断的cookie值
- 如果对应不上则是非管理员访问,不予通过
package com.example.filterdemo1.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import java.io.IOException;@WebFilter("/admin") public class AdminFileter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("admin身份检测开启");}@Overridepublic void destroy() {System.out.println("admin身份检测销毁");}@Overridepublic 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);if(cName.contains("user") && cValue.contains("admin")){// filterChain 是一个 FilterChain 对象,代表过滤器链。// doFilter() 方法用于将请求和响应对象传递给过滤器链中的下一个过滤器或目标资源。// 即当前过滤通过filterChain.doFilter(servletRequest,servletResponse);}else {System.out.println("非管理员访问");}}} }
XSS过滤
package com.example.filterdemo1.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import java.io.IOException;@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攻击");//继续拦截}} }
开启过滤后,发现成功拦截Xss攻击
内存马参考:https://mp.weixin.qq.com/s/hev4G1FivLtqKjt0VhHKmw
JavaEE-监听器-Listen
参考:https :// blog . csdn . net / qq_52797170 / article / details / 124023760-监听ServletContext、HttpSession、ServletRequest等域对象创建和销毁事件
-监听域对象的属性发生修改的事件
-监听在事件发生前、发生后做一些必要的处理
1、创建监听器
2、监听器内置方法
3、监听器触发流程
@WebListener
<listener>
.......
</listener>
4、监听器安全场景
代码审计中分析执行逻辑触发操作,红队内存马植入,蓝队清理内存马等
创建新的项目
- 创建新的项目ListenDemo1
- 在对应的包名上,创建分类包listenerr与servlet
- 在servlet下创建CSession DSession,并进行检测
- DSession一个简单的Servlet,对应一个/ds的URL映射。在收到GET请求时,它会销毁当前请求的HttpSession
listener/ListenSession
package com.example.listendemo1.listener;import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener;@WebListener public class ListenSession implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {//监听检测有Session创建就会执行这里System.out.println("监听器监听到了session创建");}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {//监听检测有Session销毁就会执行这里System.out.println("监听器监听到了session销毁");} }
这段代码定义了一个实现
HttpSessionListener
接口的监听器类ListenSession
,用于监听HttpSession
的创建和销毁事件。对于HttpSessionListener:
- 当一个新的HttpSession被创建时,sessionCreated方法将被调用。
- 当一个HttpSession被销毁时,sessionDestroyed方法将被调用。
Servlet/CSession
package com.example.listendemo1.Servlet;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException;@WebServlet("/cs") public class CSession extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Servlet里面创建Session");//创建Sessionreq.getSession();} }
Servlet/DSession
package com.example.listendemo1.Servlet;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;@WebServlet("/ds") public class DSession extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Servlet里面销毁Session");//销毁Sessionreq.getSession().invalidate();} }
监听器的触发流程:
在 web.xml 中增加如下内容放置在 web-app 标签内
@WebListener <listener> ....... </listener>
- 注册监听器:在Web应用中,你需要将监听器注册到相应的组件上。例如,在web.xml文件中配置监听器,或者使用注解(如@WebListener)标记监听器类。
- 事件发生:当与监听器关联的特定事件在Web应用中发生时,监听器会被触发。
- 调用监听器方法:监听器类中实现的相应方法(如sessionCreated、sessionDestroyed等)将被调用。这些方法包含与事件相关的信息,允许监听器执行特定的逻辑。
- 执行自定义逻辑:在监听器方法中,你可以编写自定义的逻辑以响应事件。这可能包括记录日志、修改数据、发送通知等。
思维导图
相关文章:

Day33:安全开发-JavaEE应用SQL预编译Filter过滤器Listener监听器访问控制
目录 JavaEE-预编译-SQL JavaEE-过滤器-Filter JavaEE-监听器-Listen 思维导图 Java知识点 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等. 框架库:MyBatis&#…...
Log4j如何支持多线程环境?你如何优化Log4j的性能?
Log4j如何支持多线程环境? Log4j 通过其内部设计来支持多线程环境,确保在多线程应用程序中能够安全地使用。以下是 Log4j 支持多线程环境的一些关键方面: 线程安全性: Log4j 的 Logger 类和 Appender 类都是设计为线程安全的。这…...
golang sync.Pool 指针数据覆盖问题
场景 1. sync.Pool设置 var stringPool sync.Pool{New: func() any {return new([]string)}, }func NewString() *[]string {v : stringPool.Get().(*[]string)return v }func PutString(s *[]string) {if s nil {return}if cap(*s) > 2048 {s nil} else {*s (*s)[:0]…...
VUE+内置iframe传值失效问题解决
起因: 公司业务需要计算建筑物截收面积,然后我采用的是openCV来计算,在vue内部引用不了,然后就采用了iframe原生html来完成;功能实现了我想让iframe和vue通信;然后用原有方式试了多次都失败了,i…...

Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测
目录 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 思维导图 JS知识点: 功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等 技术:原生开发&…...
Go Zero微服务个人探究之路(十六)回顾api服务和rpc服务的本质
目录 前言 正文 API(Application Programming Interface) RPC(Remote Procedure Call) API 与 RPC 的关系 分布式部署 API 和 RPC 结语 前言 go-zero 是一个基于 Go 语言的微服务框架,它提供了一套简洁的编程模…...

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的夜间车辆检测系统(深度学习代码+UI界面+训练数据集)
摘要:开发夜间车辆检测系统对于自动驾驶技术具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个夜间车辆检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5,展示了不同模型间…...
Spring体系架构
目录 核心容器(Core Container) 数据访问/集成(Data Access/Integration) Web开发(Web)...

【PLC】现场总线和工业以太网汇总
1、 现场总线 1.1 什么是现场总线 1)非专业描述: 如下图:“人机界面”一般通过以太网连接“控制器(PLC)”,“控制器(PLC)”通过 “现场总线”和现场设备连接。 2)专业描述(维基百科) 现场总线…...

【吊打面试官系列】Java虚拟机JVM篇 - 关于JVM分析
大家好,我是锋哥。今天分享关于JVM分析的JVM面试题,希望对大家有帮助; 查看JVM进程号的命令是什么? 可以使用 ps ‐ef 和 jps ‐v 等等。 怎么查看剩余内存? 比如: free ‐m, free ‐h, top 命令等等。 1000道 互联网大厂Jav…...

Mysql锁与MVCC
文章目录 Mysql锁的类型锁使用MVCC快照读和当前读读视图【Read View】串行化的解决 exlpain字段解析ACID的原理日志引擎整合SpringBoot博客记录 Mysql锁的类型 MySQL中有哪些锁: 乐观锁(Optimistic Locking):假设并发操作时不会发…...

rancher是什么
Rancher Labs是制作Rancher的公司。Rancher Labs成立于2014年,是一家专注于企业级容器管理软件的公司。它的产品设计旨在简化在分布式环境中部署和管理容器的过程,帮助企业轻松地采用容器技术和Kubernetes。Rancher Labs提供的Rancher平台支持Docker容器…...

阿里云服务器安全狗免费使用多引擎智能查杀引擎
云服务器具有按量付费、降低综合成本等诸多优势,受到很多企业的欢迎。 因此,目前使用的云服务器越来越多。 阿里云是目前云服务器中最具影响力的品牌,因此选择阿里云服务器的用户数量也是最多的。 那么阿里云服务器需要安装杀毒软件吗&#x…...
使用rust实现九九乘法表
rust目前拥有接近c/c的运行速度以及更快的编码支持,所以是很值得学习得一门语言。rust的语法及设计理念与其他的语言也有许多的不同之处。比如其特有的所有权属性。可以让开发者快速的开发出高效的运行程序。对于内存的管理也有极好的管理方案。 在这里使用rust语言…...
突破编程_C++_设计模式(简单工厂模式)
1 简单工厂模式的概念 简单工厂模式(Simple Factory Pattern)是设计模式中的一种创建型模式。它的主要目的是将对象的实例化与使用解耦,使得客户端无需关心对象的创建细节,只需通过工厂类来获取所需的对象。 在简单工厂模式中&a…...
C语言——快速排序
C语言——快速排序 一、 含义二、算法思想三、实现步骤代码实现 一、 含义 快速排序算法是在几种排序算法中效率最高的一个排序算法了,故称为快速排序,它的时间复杂度为:O(nlog2n),相比冒泡排序算法的O(n2)有很大的提升。 二、算…...
FP独立站获客秘籍大揭秘:简单高效,一看就会!
跨境电商的大潮中,越来越多的卖家选择跳出第三方平台的框架,拥抱独立站的自由与机遇。但独立站获客难、成本高的问题,也让不少卖家头疼不已。别担心,今天就来给大家揭秘FP独立站获客的简单高效方法! 首先,…...
英伟达tx2光驱烧录功能支持
今天得到一个任务,是在当前nvidia tx2平台上使能usb cdrom并且调试烧录功能。首先测试给到的信息是不能在平台上使用(废话嘛,能用还用我干嘛) 拿到本地ubuntu机器上看了下,使用brasero等软件可以顺利烧录。 此时捕获了…...

关于stm32(CubeMX+HAL库)的掉电检测以及flash读写
1.掉电检测 CubeMX配置 只需使能PVD中断即可 但是使能了PVD中断后还需要自行配置一些PWR寄存器中的参数,我也通过HAL库进行编写 void PVD_config(void) {//配置PWRPWR_PVDTypeDef sConfigPVD; sConfigPVD.PVDLevel PWR_PVDLEVEL_7; …...
Elastic script_score的使用
script_score介绍 在Elasticsearch中,script_score是在function_score查询中的一种功能强大的方式,允许用户使用内置Painless脚本语言或者其他支持的语言来动态计算每个文档的评分 script_score语法 GET /<索引名>/_search {"query":…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...