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

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

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

#知识点:

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

演示案例:

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

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

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

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

#JavaEE-预编译-SQL原理:

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

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

  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())的信息。

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

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

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

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

#JavaEE-过滤器-Filter

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

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();
}

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

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

localhost:8080/FilterDemo1_war_exploded/test?code=

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

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("
                        
                        

你可能感兴趣的:(安全,java-ee,sql)