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

news/2024/5/30 17:05:41/文章来源:https://blog.csdn.net/qq_61553520/article/details/136610854

目录

JavaEE-预编译-SQL

JavaEE-过滤器-Filter

JavaEE-监听器-Listen

思维导图


Java知识点

功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.

框架库:MyBatisSpringMVCSpringBootShiroLog4jFastJson

技术:ServletListenFilterInterceptor,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();

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

  1. 预编译写法: safesql 是一个预编译的 SQL 查询语句,其中 ? 是一个占位符,表示将在执行时动态替换。
  2. 使用 PreparedStatement: PreparedStatement 是 Statement 的子接口,用于执行预编译的 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())的信息。

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

使用预编译写法,固定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

-监听ServletContextHttpSessionServletRequest等域对象创建和销毁事件

-监听域对象的属性发生修改的事件

-监听在事件发生前、发生后做一些必要的处理

1、创建监听器

2、监听器内置方法

3、监听器触发流程

@WebListener

<listener>

.......

</listener>

4、监听器安全场景

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

创建新的项目

  1. 创建新的项目ListenDemo1
  2. 在对应的包名上,创建分类包listenerr与servlet
  3. 在servlet下创建CSession DSession,并进行检测
  4. 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>
  1. 注册监听器:在Web应用中,你需要将监听器注册到相应的组件上。例如,在web.xml文件中配置监听器,或者使用注解(如@WebListener)标记监听器类。
  2. 事件发生:当与监听器关联的特定事件在Web应用中发生时,监听器会被触发。
  3. 调用监听器方法:监听器类中实现的相应方法(如sessionCreated、sessionDestroyed等)将被调用。这些方法包含与事件相关的信息,允许监听器执行特定的逻辑。
  4. 执行自定义逻辑:在监听器方法中,你可以编写自定义的逻辑以响应事件。这可能包括记录日志、修改数据、发送通知等。

思维导图

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

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

相关文章

Era Network在web3行业的价值

近年来,以比特币和以太坊为代表的区块链技术快速发展,去中心化、信任机制的创新概念也越来越受到广泛关注。AI人工智能与区块链技术在互联网应用领域的落地,正在引领互联网进入价值互联的新阶段web3.0时代&#xff01; 新行业发展的价值与优先级 WEB3行业发展的核心需求是&…

N3-Chitosan N3 叠氮修饰壳聚糖 改性叠氮 CS-Azide

碳水科技&#xff08;Tanshtech&#xff09;可以提供壳聚糖衍生物 1.壳聚糖的各种改性(NH2/COOH/SH/N3/MAL-Chitosan等) 2.各种靶向小分子修饰壳聚糖&#xff08;Biotin/FA/cRGD-Chitosan等&#xff09; 3.各种荧光标记壳聚糖(FITC/RB/CY-Chitosan等) 4.壳聚糖和各种聚合物…

机器学习的基础学习笔记

黑马的学习视频 大家常说的人工智能、机器学习、深度学习其实是包含关系&#xff0c;深度学习是机器学习的一种特殊方法&#xff0c;而机器学习又是人工智能的一个子领域。 其中机器学习是使计算机系统能够通过学习经验和数据来改进性能。机器学习算法能够从数据中发现模式&am…

sqllab第七关通关笔记

知识点&#xff1a; 利用回显信息不同进行盲注爆破出敏感信息两种绕过方法 单引号闭合绕过&#xff1b;不加注释符 id 1 and 11 完全闭合原始语句的绕过&#xff1b;这题是采用了where id((输入)) id 1)) and 11 -- 首先判断注入类型 构造id1/0 正常回显&#xff0c;字符型注…

5.Python从入门到精通—Python 运算符

5.Python从入门到精通—Python 运算符 Python 运算符算术运算符比较&#xff08;关系&#xff09;运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级 Python 运算符 Python语言支持以下类型的运算符: 算术运算符比较&#xff08;关系&#xff09;运算符赋…

ubuntu20.04上获取Livox Avia雷达点云数据

若拿到手的Livox Avia激光雷达不知道它的ip信息&#xff0c;可以在官网上LiDAR Sensors - Livox下载上位机软件Livox Viewer&#xff0c;查看IP&#xff0c;下载window版本就可以。雷达通过网线连上电脑后&#xff0c;该软件就可以自动识别出来。按照下图步骤&#xff0c;就可以…

【计算机视觉】目标跟踪| 光流算法详细介绍|附代码

0、前言 在上篇文章中https://blog.csdn.net/Yaoyao2024/article/details/136625461?spm1001.2014.3001.5501&#xff0c;我们对目标跟踪任务和目标跟踪算法有了大致的了解。今天我们就来详细介绍一下其中的生成式算法的一种&#xff1a;光流法。 在介绍光流法之前&#xff…

基于单片机的GPS定位信息显示系统

基于单片机的GPS定位信息显示系统 摘 要 在当今信息时代的发展中&#xff0c;GPS全球定位系统是一个重要的组成部分&#xff0c;其具有精度很高、应用广泛、性能强大的特点&#xff0c;因此在实际生活中GPS全球定位显示系统被广泛运用于各类领域当中。它也是至今为止最好的定…

基于YOLOv8深度学习的野外火焰烟雾检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Linux 之九:CentOS 上 Tomcat 安装、SpringBoot 项目打包和部署

安装 Tomcat 下载 a. 方式一&#xff1a;可以在windows 真机上下载后&#xff0c;再上传到服务器 b. 方式二&#xff1a;可以在服务器端使用 wget 下载命令来下载 登录官网https://tomcat.apache.org/download-90.cgi&#xff0c;选择 linux 版本 右键&#xff0c;获取下载链接…

从政府工作报告探计算机行业发展

从政府工作报告中&#xff0c;我们可以深入洞察计算机行业在未来一年的发展趋势和政策导向。报告中明确提出了数字经济创新发展的重要性&#xff0c;以及制造业数字化转型、服务业数字化、智慧城市和数字乡村建设等关键任务&#xff0c;这些都为计算机行业提供了广阔的发展空间…

C++提高笔记(三)---STL容器(vector、deque)

1、vector容器 1.1vector基本概念 功能&#xff1a;vector数据结构和数组非常相似&#xff0c;也称为单端数组 vector与普通数组区别&#xff1a;不同之处在于数组是静态空间&#xff0c;而vector可以动态扩展 动态扩展&#xff1a;并不是在原空间之后续接新空间&#xff0…

全网最全c++中的system详解

这篇文章是二发&#xff0c;做了些微调&#xff0c;感兴趣的朋友可以看原文&#xff1a;C中的system_一只32汪的博客-CSDN博客 1&#xff0c;简介 system()函数是在C制作中十分常用&#xff0c;有用的一个函数。 其效果类似于系统中"cmd"控制台和"bat"文件…

华为机考:HJ3 明明的随机数

华为机考&#xff1a;HJ3 明明的随机数 描述 代码 set&#xff0c;插入即排序&#xff0c;而且没有重复数字 #include<iostream> #include<vector> #include<algorithm> using namespace std;int main(){int n;while(cin >> n){ //首先输入每次调查…

vue3/vue2若依框架对比,点击新增编辑跳转到新页面(新增编辑共用代码)

vue2若依框架&#xff1a; router里面定义好&#xff0c;编辑里面添加一个id {path: /filmManagement,component: Layout,hidden: true,redirect: noredirect,children: [{path: editFilmDetail,component: () > import(/views/filmManagement/editFilmDetail),name: editFi…

微信小程序如何实现下拉刷新

1.首先在你需要实现下拉刷新页面的json文件中写入"enablePullDownRefresh": true。 2.在js文件的onPullDownRefresh() 事件中实现下拉刷新。 实现代码 onPullDownRefresh() {console.log(开始下拉刷新)wx.showNavigationBarLoading()//在标题栏中显示加载图标this.d…

常用MII接口详解

开放式系统互连 (OSI) 模型 以太网层 位于最底部两层 &#xff0c;物理层(physical)和数据链路层(Date link)。 从百兆以太网接口开始 首先是百兆以太网规定的两种接口 介质无关接口 (MII) Media Independent Interface 介质相关接口 (MDI) Medium Dependent Interfa…

【大厂AI课学习笔记NO.72】AI与云计算

AI项目依靠云计算&#xff0c;借助云的力量&#xff0c;快速的启动业务&#xff0c;是比较好的一种选择。 AI模型训练过程中&#xff0c;出现算力突增&#xff0c;云计算成本低。 云平台提供一站式解决方案&#xff0c;创业公司的选择。 云端AI和边缘端的AI&#xff0c;是我们…

【机器学习】一文掌握逻辑回归全部核心点(上)。

逻辑回归核心点-上 1、引言2、逻辑回归核心点2.1 定义与目的2.2 模型原理2.2.1 定义解析2.2.2 公式2.2.3 代码示例 2.3 损失函数与优化2.3.1 定义解析2.3.2 公式2.3.3 代码示例 2.4 正则化2.4.1 分类2.4.2 L1正则化2.4.3 L2正则化2.4.4 代码示例 3、总结 1、引言 小屌丝&#…

Java高级编程—泛型

文章目录 1.为什么要有泛型 (Generic)1.1 泛型的概念1.2 使用泛型后的好处 2.在集合中使用泛型3.自定义泛型结构3.1 自定义泛型类、泛型接口3.2 自定义泛型方法 4.泛型在继承上的体现5.通配符的使用5.1 基本使用5.2 有限制的通配符的使用 1.为什么要有泛型 (Generic) Java中的…