JAVA-SpringBoot&MyBatis&Thymeleaf

Fc04dB Lv4

# 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:**😭

image-20240902160720394

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.fc0.springbootdemo1.controller;

import org.springframework.web.bind.annotation.*;

@RestController
public class IndexController {
//指定Get请求的访问路由
@RequestMapping(value = "/Fc0Get",method = RequestMethod.GET )
//@GetMapping("value = /Fc0Get")
public String getindex() {
return "Get Fc0";
}

//指定Post请求的访问路由
@RequestMapping(value = "/Fc0Post",method = RequestMethod.POST )
//@PostMapping("value = /Fc0Get")
public String getPOST() {
return "Post Fc0";
}

// 指定GET请求的访问路由,带参数名name
@RequestMapping(value = "/Fc0Get_g", method = RequestMethod.GET)
//@GetMapping(value = "/xiaodiget")
public String get_g(@RequestParam String name) {
return "get name: " + name;
}

// 指定POST请求的访问路由,带参数名name
@RequestMapping(value = "/Fc0Post_p", method = RequestMethod.POST)
//@GetMapping(value = "/xiaodiget_g")
public String get_p(@RequestParam String name) {
return "post name: " + name;
}
}

image-20240902162508553

# Mybatis

Mybatis 是一款优秀的持久层框架

  • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程,减少了代码的冗余,减少程序员的操作。
  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects, 普通的 Java 对象】映射成数据库中的记录。

User 类用来操作数据库数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.fc0.springbootmybatis.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;
}

@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}

Mapper 动态接口代理类实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.fc0.springbootmybatis.mapper;

import com.fc0.springbootmybatis.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface UserMapper {
@Select("select * from demo01")
public List<User> findAll() ;

@Select("select * from demo01 where id =1")
public List<User> findID() ;
}

Controller 实现 Web 访问调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.fc0.springbootmybatis.controller;

import com.fc0.springbootmybatis.entity.User;
import com.fc0.springbootmybatis.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 Getdemo01Controller {

@Autowired
private UserMapper userMapper;

// 根据用户id检索管理员数据的端点
@GetMapping("/getadmin")
public List<User> getadmindata(){
List<User> all = UserMapper.findAll();
return all;
}

@GetMapping("/getid")
public List<User> getadminid(){
List<User> all = UserMapper.findID();
return all;
}
}

不知道为啥总报这个错误

image-20240903000850718

引用一下别人的吧

image-20240903000936009

上面只是简单的开发过程

# 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
2
3
4
@Mapper
public interface UserMapper {
@Select("select * from admin where id like '%${id}%'")
public List<User> findAll(Integer id);

Untitled

# SSTI-Thymeleaf

thymeleaf 模板注入学习与研究–查找与防御 (qq.com)

Thymeleaf 是用来开发 Web 和独立环境项目的现代服务器端 Java 模板引擎,既适用于 web 环境,也适用于独立环境,比较适合当前的人员分工问题。其能够处理 HTML、XML、JavaScript、CSS 甚至纯文本。提供了一种优雅且高度可维护的模板创建方法,可以直接在浏览器中正确显示,也可以作为静态原型方便开发团队协作。

1
2
3
4
5
6
7
8
9
10
11
12
// src/main/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}">Fc04dB</span>
</body>
</html>

image-20240903161114715

1
2
3
4
5
6
7
8
9
10
11
12
// src/main/resources/templates/test.html

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

image-20240903161620147

Controller 定义的路由(/test)会渲染对应的 templates 里的 html 文件(test.html)页面

# 安全问题:

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

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

Untitled

index-en.html

1
2
3
4
5
6
7
8
9
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>

</body>
</html>

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

image-20240903162917972

  • 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.
Comments
On this page
JAVA-SpringBoot&MyBatis&Thymeleaf