【第23章】MyBatis-Plus之SQL数据安全保护


前言

MyBatis-Plus 提供了数据安全保护功能,旨在防止因开发人员流动而导致的敏感信息泄露。从3.3.2版本开始,MyBatis-Plus 支持通过加密配置和数据安全措施来增强数据库的安全性。


一、配置安全

1. YML 配置加密

MyBatis-Plus 允许你使用加密后的字符串来配置数据库连接信息。在 YML 配置文件中,以 mpw: 开头的配置项将被视为加密内容。

spring:
  datasource:
    url: mpw:qRhvCwF4GOqjessEB3G+a5okP+uXXr96wcucn2Pev6Bf1oEMZ1gVpPPhdDmjQqoM
    password: mpw:Hzy5iliJbwDHhjLs1L0j6w==
    username: mpw:Xb+EgsyuYRXw7U7sBJjBpA==

2. 密钥加密

使用 AES 算法生成随机密钥,并对敏感数据进行加密。

// 生成16位随机AES密钥
String randomKey = AES.generateRandomKey();

// 使用随机密钥加密数据
String encryptedData = AES.encrypt(data, randomKey);

3. 如何使用

在启动应用程序时,通过命令行参数或环境变量传递密钥。

// Jar 启动参数示例(在IDEA中设置Program arguments,或在服务器上设置为启动环境变量)
--mpw.key=d1104d7c3b616f0b

注意
加密配置必须以 mpw: 字符串开头。
随机密钥应由负责人妥善保管,知晓的人越少越好。

4. 数据安全

MyBatis-Plus 提供了字段加密解密和字段脱敏功能,以保护存储在数据库中的敏感数据。

  • 字段加密解密:对数据库中的特定字段进行加密存储,并在需要时解密使用。
  • 字段脱敏:对敏感字段进行脱敏处理,以隐藏或模糊敏感信息。

二、SQL 注入安全保护

MyBatis-Plus 提供了自动和手动两种方式来检查 SQL 注入风险。

1.自动检查

使用 Wrappers.query() 方法时,可以通过 .checkSqlInjection() 开启自动检查。

Wrappers.query()
// 开启自动检查 SQL 注入
.checkSqlInjection().orderByDesc("任意前端传入字段")

2. 手动校验

使用 SqlInjectionUtils.check() 方法进行手动校验。

// 手动校验前端传入的字段是否存在 SQL 注入风险
SqlInjectionUtils.check("任意前端传入字段")//@return true 非法 false 合法

三、实战

1. 配置加密

package org.example.springboot3.mybatisplus;

import com.baomidou.mybatisplus.core.toolkit.AES;

/**
 * Create by zjg on 2024/7/6
 */
public class SecureTest {
    public static void main(String[] args) {
        encrypt(args);
    }
    public static void encrypt(String[] args){
        if(args.length<1){
            System.err.println("缺少必要的参数");
            return;
        }
        // 生成16位随机AES密钥
        String randomKey = AES.generateRandomKey();
        System.out.println("--mpw.key="+randomKey);
        // 使用随机密钥加密数据
        String url = AES.encrypt(args[0], randomKey);
        String user = AES.encrypt(args[1], randomKey);
        String password = AES.encrypt(args[2], randomKey);
        System.out.println("mpw:"+url);
        System.out.println("mpw:"+user);
        System.out.println("mpw:"+password);
    }
    public static void decrypt(){
        String str = AES.decrypt("data", "key");
        System.out.println(str);
    }
}

Program arguments中输入配置信息,空格作为分隔符

在这里插入图片描述

2. 修改配置

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: mpw:a7qfNhof3QWE/ZG9kXsRp3OAmvTKUtEoplWqG8Kv6HnIx/AtbvKWV9xHyF2RRVBjU/rNHNxD5coPsZAW1jOH4SvjtpDrOxrRd/b9Oxbouru2SQexExI8wi+txRXcl0q2IvdStkAioc5h2BJy0mpN2WAoLC3QTB8LrRSAY5bWNS9srDQiR1PEUapM7Rqa99wc
      username: mpw:Pf7a3NpWt1WaqGExQCK5JA==
      password: mpw:zbvqB2O0M7IzVPkVAPDd8A==

3. 启动参数

// Jar 启动参数示例(在IDEA中设置Program arguments,或在服务器上设置为启动环境变量)
--mpw.key=PPrnjeqDwk2zBwHj

在这里插入图片描述

4. 启动

在这里插入图片描述

P6Spy打印sql语句,程序正常启动,配置加密成功。


总结

回到顶部

通过上述措施,MyBatis-Plus 帮助你构建了一个更加安全的数据库环境,保护了敏感数据不被泄露。

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-plus是在Mybatis基础上进行封装的一个框架,它简化了平时开发过程中对常用接口的调用,可以省去一些繁琐的操作。然而,对于一些更为复杂的查询,Mybatis-plus可能无法满足需求,此时就需要我们自定义SQL语句来实现。通过在入口类的MybatisSqlSessionFactoryBuilder#build方法中注入mybatis-plus自定义的动态配置xml文件,可以实现自定义SQL语句和动态SQL的功能。具体的实现步骤如下: 1. 在应用启动时,在入口类的MybatisSqlSessionFactoryBuilder#build方法中将mybatis-plus的自定义动态配置xml文件注入到Mybatis中。 2. 在自定义的动态配置xml文件中,可以使用各种Mybatis-plus提供的方法来实现动态SQL的功能,比如IF标签、CHOOSE标签、FOREACH标签等。 3. 在自定义SQL语句中,可以结合Mybatis-plusWrapper类来实现条件查询,例如使用LambdaQueryWrapper来构建查询条件。 总结起来,Mybatis-plus提供了简化开发的接口,但对于一些更为复杂的查询,仍然需要我们自定义SQL语句和动态SQL来实现。通过注入自定义的动态配置xml文件,并结合Mybatis-plus提供的方法和Wrapper类,可以实现更加灵活和高效的数据查询。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [mybatis-plus/mybatis 自定义 sql 语句、动态 sql](https://blog.csdn.net/CREATE_17/article/details/109117091)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Mybatis Plus实现动态SQL语句的原理,你知道吗?](https://blog.csdn.net/weixin_38405253/article/details/119880820)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值