Day38:安全开发-JavaEE应用SpringBoot框架MyBatis注入Thymeleaf模版注入

目录

SpringBoot-Web应用-路由响应

SpringBoot-数据库应用-Mybatis

SpringBoot-模版引擎-Thymeleaf

思维导图


Java知识点

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

框架库:MyBatisSpringMVCSpringBootShiroLog4jFastJson

技术:ServletListenFilterInterceptor,JWT,AOP,反射机制待补充

安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充

安全:原生开发安全,第三方框架安全,第三方库安全等,待补充

SpringBoot-Web应用-路由响应

Spring Boot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。Spring Boot通过自动配置功能,降低了复杂性,同时支持基于JVM的多种开源框架,可以缩短开发时间,使开发更加简单和高效。

参考:https://springdoc.cn/spring-boot/

1、路由映射:

  • @RequestMapping, @GetMapping, 和 @PostMapping 注解用于定义HTTP请求的映射路径。
  • @RequestMapping 是通用注解,而 @GetMapping 和 @PostMapping 是其简化形式,分别用于处理GET和POST请求。

2、参数传递:

  • @RequestParam 注解用于从HTTP请求中提取参数,使得控制器方法可以访问并使用这些参数。

3、数据响应:

  • @RestController 注解用于标识一个类是RESTful风格的控制器,它包含了 @ResponseBody 和 @Controller 的功能。
  • @ResponseBody 表示方法的返回值将直接作为HTTP响应体返回给客户端。
  • @Controller 通常用于标识传统的MVC控制器,而 @RestController 更适用于RESTful风格的控制器。

创建SpringDemo项目
修改服务器URL:https://start.aliyun.com(速度更快版本更稳定)
选择Spring Web
创建cn.wusuowei.springdemo.controller.IndexController

项目目录如下:

package cn.wusuowei.springdemo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@RestController
public class IndexController {// 指定GET请求的访问路由@RequestMapping(value = "/xiaodiget", method = RequestMethod.GET)//@GetMapping(value = "/xiaodiget")public String getindex() {return "get test";}// 指定POST请求的访问路由@RequestMapping(value = "/xiaodipost", method = RequestMethod.POST)//@PostMapping(value = "/xiaodipost")public String getpost() {return "post test";}// 指定GET请求的访问路由,带参数名name@RequestMapping(value = "/xiaodiget_g", method = RequestMethod.GET)//@GetMapping(value = "/xiaodiget")public String get_g(@RequestParam String name) {return "get test" + name;}// 指定POST请求的访问路由,带参数名name@RequestMapping(value = "/xiaodiget_g", method = RequestMethod.POST)//@GetMapping(value = "/xiaodiget_g")public String get_p(@RequestParam String name) {return "post test" + name;}
}

注解说明:

  • @RestController 注解表示这是一个控制器类,专门用于处理RESTful请求,同时它也包含了 @ResponseBody 和 @Controller 的功能。
  • 使用 @RequestMapping 注解指定了类中所有方法的基本路径,即这些方法的映射路径的前缀。

GET请求处理:

  • getindex() 方法用于处理GET请求,映射路径是 “/xiaodiget”。
  • get_g() 方法用于处理GET请求,映射路径是 “/xiaodiget_g”,并且使用 @RequestParam 注解来接收名为 “name” 的参数。

POST请求处理:

  • getpost() 方法用于处理POST请求,映射路径是 “/xiaodipost”。
  • get_p() 方法用于处理POST请求,映射路径同样是 “/xiaodiget_g”,并且同样使用 @RequestParam 注解来接收名为 “name” 的参数。

注解的简化形式:

  • 在注释中也提到了使用 @GetMapping 和 @PostMapping 的简化形式,这两者分别等同于 @RequestMapping 中指定了请求方法的注解。

SpringBoot-数据库应用-Mybatis

在 JAVA 中分析 SQL 注入,采用什么数据库驱动,其使用访问数据库方法不同,所以造成的安全问题也不同。

对小迪上课搜到的三种方式有想了解一下的可以看下面链接
MyBatis 与 JDBC 和 Hibernate 的比较:https://blog.csdn.net/Knight_Key/article/details/131122995

数据库先创建需操作的数据

项目添加 Mybatis & 数据库驱动

  • 若创建项目时选择了 MySQL Driver 和 MyBatis Framework 两个依赖,则项目文件 pom.xml 中会自动添加下面内容
  • 创建项目时若未选择上述两个依赖,则需要手动在 pom.xml 中的 dependencies 标签中添加以下内容
 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>

项目配置数据库连接信息

  • 默认配置信息文件为 src/main/resources/ 目录下的 application.properties,这里手动改为了 application.yml
  • 然后清空文件内容,写入下面代码
spring:datasource:url: jdbc:mysql://localhost:3306/demo01username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver

创建 User 类用来操作数据库数据

  • cn.suyou.springbootmybatis.entity.User,在 src/main/java/ 自己创建的组名目录下新建 java 类,输入 entity.User,会自动创建一个 entity 软件包并创建 User.java。
  • set get toString 方法使用下面的快捷键可以一键生成。
  • IDEA 快捷键 alt+insert, 或者右键生成 Getter (),Setter (),toString (),全选然后自动生成即可。
package com.example.springbootmybatils.entity;public class User {private Integer id;private String username;private String password;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

创建 Mapper 动态接口代理类实现

  • 创建 java 类时选择接口
  • cn.suyou.springbootmybatis.mapper.UserMapper,在 src/main/java/ 自己创建的组名目录下新建 java 类,输入 mapper.UserMapper,会自动创建一个 mapper 软件包并创建 UserMapper.java。
  • ${id} 是拼接写法,#{id} 是预编译写法
package com.example.springbootmybatils.mapper;import com.example.springbootmybatils.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface UserMapper {// ${id} 是拼接写法,#{id} 是预编译写法@Select("select * from admin where id like '%${id}%'")public List<User> findAll(Integer id);@Select("select * from admin where id=1")public List<User> findID();
}

创建 Controller 实现 Web 访问调用

  • cn.suyou.springbootmybatis.controller.GetadminController
  • 这个和前面的那个 web 应用访问一样,就是返回数据为从数据库获取信息
package com.example.springbootmybatils.controller;import com.example.springbootmybatils.entity.User;
import com.example.springbootmybatils.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class GetadminController {@Autowiredprivate UserMapper UserMapper;@GetMapping("/getadmin")public List<User> getadmindata(@RequestParam Integer id){List<User> all = UserMapper.findAll(id);return all;}@GetMapping("/getid")public List<User> getadminid(){List<User> all = UserMapper.findID();return all;}}

解决8080端口占用问题

netstat -ano | findstr "8080"

taskkill /F /PID 10056

安全危险:mybatis sql语句注入风险

SpringBoot-模版引擎-Thymeleaf

不安全的模版版本
日常开发中:语言切换页面,主题更换等传参导致的 SSTI 注入安全问题
漏洞参考:https://mp.weixin.qq.com/s/NueP4ohS2vSeRCdx4A7yOg

使用模板渲染,必须在resources目录下创建templates存放html文件

遇到问题:路径访问并没有从模板渲染,而是当成字符串显示操作

原因:@RestController包含了 @ResponseBody 和 @Controller 的功能。@ResponseBody index当做字符串显示操作

解决方式:更换为@Controller 没有ResponseBody index当做资源文件去渲染

项目目录如下:

controller/ThyremeafController.java

package cn.xiaodisec.thyremeafdemo.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@Controller
public class ThyremeafController {
//    @RequestMapping(value = "/")
//    public String index(Model model) {
//        model.addAttribute("data","hello xiaodi");
//        //@RestController ResponseBody index当做字符串显示操作
//        //Controller 没有ResponseBody index当做资源文件去渲染
//        return "index";
//    }@RequestMapping(value = "/test")public String index() {//@RestController ResponseBody index当做字符串显示操作//Controller 没有ResponseBody index当做资源文件去渲染return "test";}@RequestMapping(value = "/")public String index(@RequestParam String lang) {//@RestController ResponseBody index当做字符串显示操作//Controller 没有ResponseBody index当做资源文件去渲染return lang; //lang=en index-en}}

resources/templates/index.html

<!DOCTYPE html>
<html  xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body >
<span th:text="${data}">小迪安全</span>
</body>
</html>

resources/templates/index-en.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body></body>
</html>

application.properties

# 应用服务 WEB 访问端口
server.port=8080
# THYMELEAF (ThymeleafAutoConfiguration)
# 开启模板缓存(默认值: true )
spring.thymeleaf.cache=true
# 检查模板是否存在,然后再呈现
spring.thymeleaf.check-template=true
# 检查模板位置是否正确(默认值 :true )
spring.thymeleaf.check-template-location=true
#Content-Type 的值(默认值: text/html )
spring.thymeleaf.content-type=text/html
# 开启 MVC Thymeleaf 视图解析(默认值: true )
spring.thymeleaf.enabled=true
# 模板编码
spring.thymeleaf.encoding=UTF-8
# 要被排除在解析之外的视图名称列表,⽤逗号分隔
spring.thymeleaf.excluded-view-names=
# 要运⽤于模板之上的模板模式。另⻅ StandardTemplate-ModeHandlers( 默认值: HTML5)
spring.thymeleaf.mode=HTML5
# 在构建 URL 时添加到视图名称前的前缀(默认值: classpath:/templates/ )
spring.thymeleaf.prefix=classpath:/templates/
# 在构建 URL 时添加到视图名称后的后缀(默认值: .html )
spring.thymeleaf.suffix=.html

安全问题

日常开发中:语言切换页面,主题更换等传参导致的SSTI注入安全问题

例如:更换中英文页面模板

启动项目,并输入对应路由访问,指向渲染文件的文件名

注入为:

http://127.0.0.1:8080/?lang=%7bnew java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("calc").getInputStream()).next()%7d__::.x](http://127.0.0.1:8080/?lang=__%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d::.x)

思维导图

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

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

相关文章

【JavaEE初阶 -- 多线程2】

这里写目录标题 1.线程安全1.1 什么是线程安全1.2 原子性1.3 线程不安全的原因1.4 通过synchronized进行加锁解决线程安全问题1.5 可重入锁1.6 死锁1.7 Java标准库中的线程安全类1.8 通过volatile关键字解决内存可见性引起的线程安全问题 2. wait 和notify2.1 wait() --使当前线…

【30天】Python从入门到精通详解版—第一天—Python 基础语法详细讲解-上

【30天】Python从入门到精通详解版—第一天—Python 基础语法详细讲解-上 Python变量Python数据类型数字类型&#xff08;Number&#xff09;字符串类型&#xff08;String&#xff09;列表类型&#xff08;List&#xff09;元组类型&#xff08;Tuple&#xff09;字典类型&…

数字华容道项目总结

目录 项目名称&#xff1a; 项目背景&#xff1a; 项目目标&#xff1a; 项目成果&#xff1a; 经验教训及学习&#xff1a; 未来优化&#xff1a; 项目名称&#xff1a; 数字华容道小游戏 项目背景&#xff1a; 在学习编程过程中&#xff0c;为了加强特性技术和对概念…

Text-to-SQL 工具Vanna进阶|数据库对话机器人的多轮对话

跟数据库对话机器人对话,我可不止一个问题。 可能基于第一句问话,还有第二句、第三句问话。。。第N句对话。所以本文测试了多轮对话功能。 单轮对话的环境搭建参考博客 Text-to-SQL 工具Vanna + MySQL本地部署 | 数据库对话机器人 我的数据是这样 1. 基础配置 import vann…

Hadoop基础架构及其特点解析

​一、Hadoop基础架构概述 Hadoop是一个由Apache基金会所开发的分布式系统基础架构&#xff0c;它利用集群的威力进行高速运算和存储。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。Hadoop不仅稳定可靠&#xff0c;而且具有强大的可伸缩性&#xff0c;…

Parade Series - WebRTC ( < 300 ms Low Latency )

Parade Series - FFMPEG (Stable X64) C:\Conda\parading-cam>ffmpeg -f dshow -i video"Surface Camera Front" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -an -rtsp_transport tcp -f rtsp://127.0.0.1:8554/cam0801

SCI 图像处理期刊

引用 一区 1. IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE 顶刊:是 出版商:IEEE 2. IEEE Transactions on Multimedia 顶刊:是 出版商:IEEE 3. Information Fusion 顶刊:是 出版商:ELSEVIER 4.IEEE TRANSACTIONS ON IMAGE PROCESSING 顶刊:是 出版商:I…

前端面试题 ===> 【Ajax、请求】

Ajax 面试题总结 1. 什么是Ajax&#xff0c;原理是什么&#xff1f; 定义&#xff1a; 在网页中利用XMLHttpRequest对象和服务器进行数据交互的方式称为Ajax&#xff1b; XMLHttpRequest是Ajax的核心机制&#xff0c;他是IE5首先引入的&#xff0c;是一种支持异步请求的技术&…

ABB IORR2100-30拍合式接触器

ABB的IORR2100-30拍合式接触器是一款高性能的电气元件&#xff0c;主要用于控制和保护电路。这种接触器具有快速响应、高可靠性以及良好的耐久性等特点&#xff0c;广泛应用于工业自动化、电力系统和电机控制等领域。 拍合式接触器的设计使其能够在需要时迅速接通或断开电路。当…

45. 跳跃游戏 II(力扣LeetCode)

文章目录 45. 跳跃游戏 II贪心 45. 跳跃游戏 II 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j <…

《次神光之觉醒》游戏简单拆解

文章目录 一、 介绍二、 游戏拆解图三、 部分模块拆解1.主界面关卡制放置挂机2.养成升级战斗属性值角色养成装备养成技能养成天赋养成藏品养成契约养成宠物养成挖矿养成 3.副本4.任务5.pvppvp竞技场锦标赛黄金矿工锦标赛公会营地 6.社交游戏圈世界频道好友系统 一、 介绍 《次…

谈谈Darknet53为啥这么难训练

在我使用Imagenet2012对Darknet53进行预训练的时候&#xff0c;往往训练到一半&#xff0c;就会出现过拟合&#xff0c;导致无法继续向下训练&#xff0c;尝试了很多方法&#xff0c;最后发现问题出现在下图红框的部分。 得出这个结论是因为当我使用Resnet中&#xff0c;包含有…

Java集合基础知识总结(绝对经典)

List接口继承了Collection接口&#xff0c;定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理&#xff0c;还添加了面向位置的操作。 实际上有两种list&#xff1a;一种是基本的ArrayList&#xff0c;其优点在于随机访问元素&#xff0c;另一种是更强大的L…

利用HubSpot出海CRM和人工智能技术提升出海业务的效率和效果

在当今数字化时代&#xff0c;智能化营销已经成为企业获取客户和扩大市场份额的关键策略。特别是对于出海业务而言&#xff0c;利用智能化营销技术来应对不同文化、语言和市场的挑战&#xff0c;已经成为企业竞争的关键优势。今天运营坛将带领大家探讨如何利用HubSpot CRM和人工…

大模型在智能推荐系统中的应用与挑战

摘要&#xff1a; 本文将深入探讨大模型在智能推荐系统中的应用与挑战&#xff0c;并详细介绍实现智能推荐系统的关键步骤。文章结构将包括引言、基础知识回顾、核心组件、实现步骤、代码示例、技巧与实践、性能优化与测试、常见问题与解答、结论与展望以及附录。 引言&#…

技术方案|某工业集团PaaS容灾方案

在当今快速发展的数字化时代&#xff0c;业务的连续性和稳定性已成为企业核心竞争力的重要组成部分。然而&#xff0c;由于各种原因&#xff0c;企业常常面临着数据丢失、系统瘫痪等潜在风险。因此&#xff0c;制定一套科学、高效的容灾方案至关重要。本文将围绕某全球领先的工…

css实现梯形?

HTML: <div class"box"></div> CSS: .box{width:50px;height:0;border-bottom:50px solid pink;border-left:50px solid #fff;border-right:50px solid #fff; } 效果&#xff1a;

opencv dnn模块 示例(25) 目标检测 object_detection 之 yolov9

文章目录 1、YOLOv9 介绍2、测试2.1、官方Python测试2.1.1、正确的脚本2.2、Opencv dnn测试2.2.1、导出onnx模型2.2.2、c测试代码 2.3、测试统计 3、自定义数据及训练3.1、准备工作3.2、训练3.3、模型重参数化 1、YOLOv9 介绍 YOLOv9 是 YOLOv7 研究团队推出的最新目标检测网络…

22.4 docker

22.4 docker 1. docker简介2. docker架构3. 容器和仓库4. Docker安装:基于Linux5. docker容器生成与运行5.1 docker换源5.2 启动容器5.3 docker search6. docker基于redis演示6.1 run -i -t:终端运行redis容器(不推荐)6.2 访问docker正在运行容器6.3 -d:后台运行redis容器6.4 停…

IDEA开启Run Dashboard

1、Run Dashboard是什么&#xff0c;为什么要使用 Run Dashboard 是 IntelliJ IDEA 中的一个工具窗口&#xff0c;用于管理和监视项目中正在运行的应用程序和配置。它提供了一种集中管理运行和调试过程的方式&#xff0c;可以让开发人员更方便地查看和控制正在运行的应用程序。…