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":…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...













