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

本文聚焦JavaEE安全开发,介绍了SQL预编译原理,其可防止SQL注入攻击。还阐述了Filter过滤器和Listen监听器的创建、内置方法、触发流程及安全场景,如利用过滤器实现cookie身份验证、拦截Xss攻击等。此外,提及网络安全行业特点及学习资料。

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

![Untitled](https://img-
blog.csdnimg.cn/img_convert/4430bbc38857cfe13791a7fe6c08d041.png)

#知识点:

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

演示案例:

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

![Untitled](https://img-
blog.csdnimg.cn/img_convert/98453e4a48763fee8f5f963b0c030813.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/fc683fb3d1be4eadf485610b54e2bb23.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/aa293db33af89637a7d82c5683a048d4.png)

#JavaEE-预编译-SQL原理:

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

![Untitled](https://img-
blog.csdnimg.cn/img_convert/69468e50c46e91a62ea8653a1bbbe002.png)

  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](https://img-
blog.csdnimg.cn/img_convert/7f1b87e0767030b678de5f33c26c968a.png)

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

![Untitled](https://img-
blog.csdnimg.cn/img_convert/9c58afdad0e46f31ce6409d34ae4297c.png)

#JavaEE-过滤器-Filter

![Untitled](https://img-
blog.csdnimg.cn/img_convert/fc683fb3d1be4eadf485610b54e2bb23.png)

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](https://img-
blog.csdnimg.cn/img_convert/7331f615665466a997ca2a8abea017ac.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/6b4d0ffb6fb47f829988f8bb96fd6a57.png)

localhost:8080/FilterDemo1_war_exploded/test?code=

![Untitled](https://img-
blog.csdnimg.cn/img_convert/dc4074539abf5d8623a805f193c64b3d.png)

2、创建过滤器
3、过滤器内置方法
  • 在对应的filter下创建XssFilter

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

    • init doFilter destroy
    1. init(FilterConfig filterConfig):
    • 该方法在过滤器被初始化时调用, 只会执行一次。
    • 用于执行一些初始化操作,例如获取配置信息等。
    1. doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain):
    • 这是过滤器的主要方法,在每次请求被过滤时都会调用。
    • doFilter 方法中的 filterChain.doFilter(request, response) 表示继续执行过滤器链,如果没有更多的过滤器,最终将调用目标资源(例如 Servlet 或 JSP)。
    • 如果在 doFilter 中不调用 filterChain.doFilter ,则请求将被拦截,不会继续传递。
    1. 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](https://img-
blog.csdnimg.cn/img_convert/5edc392cfced8b1d88a05a48df9da59c.png)

  • 在filter下创建AdminFileter

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

![Untitled](https://img-
blog.csdnimg.cn/img_convert/8af419df9502b85fd94a74c228b1c194.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/2eec1397ad8d3f49a00b9c979e0b93ef.png)

    @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](https://img-
blog.csdnimg.cn/img_convert/4c6917b16ed6cea8cd3bf9760678c52f.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/e9fef4c53adc33e3307656216e6debb0.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/18933f94660f2f9b8a06de00b7baf7f5.png)

6、过滤器安全场景

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

![Untitled](https://img-
blog.csdnimg.cn/img_convert/b077db3f5827b336ce0735a6995a3ca1.png)

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

#JavaEE-监听器-Listen

![Untitled](https://img-
blog.csdnimg.cn/img_convert/8a5c8714380840f481a46da453232657.png)

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

1、创建监听器

![Untitled](https://img-
blog.csdnimg.cn/img_convert/7f9fb818be739e54ae9352791caf1392.png)

  • 创建新的项目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](https://img-
blog.csdnimg.cn/img_convert/5875679cdc5c11d4e852dfd923f7a3df.png)

3、监听器触发流程

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

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

举例来说,对于HttpSessionListener

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

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

4、监听器安全场景

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

题外话

初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:

2023届全国高校毕业生预计达到1158万人,就业形势严峻;

国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。

一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。

6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。

2022届大学毕业生月收入较高的前10个专业

本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。

具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。

“没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。

网络安全行业特点

1、就业薪资非常高,涨薪快 2022年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!

img

2、人才缺口大,就业机会多

2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。
img

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

img

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值