JAVA-SpringBoot&MyBatis&Thymeleaf
# SpringBoot
Spring Boot 是由 Pivotal 团队提供的一套开源框架,可以简化 spring 应用的创建及部署。它提供了丰富的 Spring 模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。Spring Boot 通过自动配置功能,降低了复杂性,同时支持基于 JVM 的多种开源框架,可以缩短开发时间,使开发更加简单和高效
官方文档:Spring Boot 中文文档 (springdoc.cn)
1、路由映射:
- @RequestMapping, @GetMapping, 和 @PostMapping 注解用于定义 HTTP 请求的映射路径。
- @RequestMapping 是通用注解,而 @GetMapping 和 @PostMapping 是其简化形式,分别用于处理 GET 和 POST 请求。
2、参数传递:
- @RequestParam 注解用于从 HTTP 请求中提取参数,使得控制器方法可以访问并使用这些参数。
3、数据响应:
- @RestController 注解用于标识一个类是 RESTful 风格的控制器,它包含了 @ResponseBody 和 @Controller 的功能。
- @ResponseBody 表示方法的返回值将直接作为 HTTP 响应体返回给客户端。
- @Controller 通常用于标识传统的 MVC 控制器,而 @RestController 更适用于 RESTful 风格的控制器
** 第一个 SpringBoot:**😭
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 中指定了请求方法的注解。
1 | package com.fc0.springbootdemo1.controller; |
# Mybatis
Mybatis 是一款优秀的持久层框架
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程,减少了代码的冗余,减少程序员的操作。
- MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects, 普通的 Java 对象】映射成数据库中的记录。
User 类用来操作数据库数据
1 | package com.fc0.springbootmybatis.entity; |
Mapper 动态接口代理类实现
1 | package com.fc0.springbootmybatis.mapper; |
Controller 实现 Web 访问调用
1 | package com.fc0.springbootmybatis.controller; |
不知道为啥总报这个错误
引用一下别人的吧
上面只是简单的开发过程
# mybatis 注入
Mybatis 的 SQL 语句可以基于注解的方式写在类方法上面,更多的是以 xml 的方式写到 xml 文件。
Mybatis 中 SQL 语句需要我们自己手动编写或者用 generator 自动生成。编写 xml 文件时,Mybatis 支持两种参数符号,一种是 #,另一种是 $。比如:
1 | <select id="queryAll" resultMap="resultMap"> SELECT * FROM NEWS WHERE ID = #{id}</select>、 |
#使用预编译,$ 使用拼接 SQL。
(1)#{}
- #{} 底层通过 prepareStatement 对当前传入的 sql 进行了预编译,一个 #{} 被解析为一个参数占位符?;
- #{} 解析之后会将 String 类型的数据自动加上引号,其他数据类型不会
- #{} 很大程度上可以防止 sql 注入(sql 注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作)
- #{} 一般用在 insert 的字段和 where 条件中,用来防止 sql 注入
(2)${}
- ${} 仅仅为一个纯粹的 string 替换,在动态 sql 解析阶段将会进行变量替换
- ${} 解析之后是什么就是什么
- ${} 用在 sql 字符串拼接中,使用时需要非常谨慎。但是像一些没有直接和系统用户接触的功能如动态切换表名,库名呀就不存在注入问题了。一旦要使用在要被用户直接接触的 sql 中,一定要注意!
1、模糊查询
1 | Select * from news where title like ‘%#{title}%’ |
在这种情况下使用 #程序会报错,新手程序员就把 #号改成了 $, 这样如果 java 代码层面没有对用户输入的内容做处理势必会产生 SQL 注入漏洞。
正确写法:
1 | select * from news where tile like concat(‘%’,#{title}, ‘%’) |
2、in 之后的多个参数
in 之后多个 id 查询时使用# 同样会报错,
1 | Select * from news where id in (#{ids}) |
正确用法为使用 foreach,而不是将 #替换为 $
1 | id in<foreach collection="ids" item="item" open="("separatosr="," close=")">#{ids} </foreach> |
3、order by 之后
这种场景应当在 Java 层面做映射,设置一个字段 / 表名数组,仅允许用户传入索引值。这样保证传入的字段或者表名都在白名单里面。需要注意的是在 mybatis-generator 自动生成的 SQL 语句中,order by 使用的也是 $,而 like 和 in 没有问题。
1 |
|
# SSTI-Thymeleaf
thymeleaf 模板注入学习与研究–查找与防御 (qq.com)
Thymeleaf 是用来开发 Web 和独立环境项目的现代服务器端 Java 模板引擎,既适用于 web 环境,也适用于独立环境,比较适合当前的人员分工问题。其能够处理 HTML、XML、JavaScript、CSS 甚至纯文本。提供了一种优雅且高度可维护的模板创建方法,可以直接在浏览器中正确显示,也可以作为静态原型方便开发团队协作。
1 | // src/main/resources/templates/index.html |
1 | // src/main/resources/templates/test.html |
Controller 定义的路由(/test)会渲染对应的 templates 里的 html 文件(test.html)页面
# 安全问题:
日常开发中:语言切换页面,主题更换等传参导致的 SSTI 注入安全问题
例如:更换中英文页面模板
index-en.html
1 | <html lang="en"> |
payload:
1 | 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 |
- Title: JAVA-SpringBoot&MyBatis&Thymeleaf
- Author: Fc04dB
- Created at : 2024-09-02 15:21:33
- Updated at : 2024-09-03 16:32:09
- Link: https://redefine.ohevan.com/2024/09/02/JAVA-SpringBoot-MyBatis-Thymeleaf/
- License: This work is licensed under CC BY-NC-SA 4.0.