【第33章】MyBatis-Plus之预防安全漏洞

文章目录

  • 前言
  • 一、什么是漏洞?
  • 二、如何预防漏洞
    • 1.表字段部分
    • 2.字段参数/变量部分
    • 3. 使用工具类预防
  • 三、关于恶意漏洞的说明
  • 总结


前言

软件漏洞可以对系统造成严重危害,如果被人恶意利用,会导致病毒感染、数据泄漏或损坏的风险,还可能面临直接或间接的经济损失。那么,我们应该如何预防这些漏洞呢?在深入探讨漏洞问题之前,首先需要明确什么是漏洞。


一、什么是漏洞?

漏洞是指软件、系统或网络中存在的安全弱点或错误,这些弱点可能导致系统遭受攻击或被不当使用。在计算机安全领域,漏洞通常源于编程错误、设计缺陷或配置失误。

对于对象关系映射(ORM)框架来说,漏洞通常指的是设计或实施中的安全问题,这些问题可能让应用程序面临SQL注入攻击的风险。

SQL 注入漏洞
如果ORM框架在执行SQL操作时没有正确过滤或转义用户输入,攻击者可以利用输入的恶意数据来执行未经授权的数据库操作,从而造成数据泄露、损坏或篡改。

什么情况下会引起 SQL 注入攻击呢?通常是在以下情况:

  • 表结构部分:通常包含表字段、表名等固定内容。
  • 表字段参数/变量部分:通过包含各种动态 SQL 参数。

通常 ORM 中 SQL 注入漏洞的发生都是因为以上两个部分允许从前台传参导致的。

二、如何预防漏洞

明白漏洞产生的主要原因,那么我们只需要控制好表结构、参数相关的数据,避免他们暴露到前端既可避免漏洞攻击。

1.表字段部分

对于表字段部分通常来说应该由后端控制,但有些系统为了保持足够大的灵活性,允许前端动态传入数据库字段名称。这种做法虽然满足了系统的灵活性要求,却面临着极大的 SQL 注入风险。

如果想要规避风险,就必须要求系统设计者或开发人员自行控制字段的安全性,绝对不能让前端任意传入字符串直接转换为 SQL 字段,应通过字段映射逻辑来阻断攻击,避免前端接口传入的字段内容直接进入 SQL 编译阶段中生成最终 SQL。

2.字段参数/变量部分

对于字段参数部分,ORM 框架通常有做预编译防止 SQL 注入攻击的逻辑,在 MyBatis 中,通过使用 # 占位符,而不是 $ 占位符来避免 SQL 注入攻击。

MyBatis-Plus 在生成相关的 SQL 时底层能力同样来自 MyBatis,所以一样的可以是用 # 占位符来避免攻击,只不过这一个步骤由 MyBatis-Plus 自动完成了。

3. 使用工具类预防

一般来说,通过上面的处理就可以避免 SQL 注入攻击了,如果您还不放心,可以使用 MyBatis-Plus 提供的工具类 SqlInjectionUtils.check(内容) 来验证字符串是否存在 SQL 注入,如果存在则会抛出对应的异常,

// 开启自动检查 SQL 注入 (3.5.3.2+ 版本支持
Wrappers.query().checkSqlInjection().orderByDesc("任意前端传入字段")
​
// 手动校验方式 (3.4.3.2+ 版本支持)
SqlInjectionUtils.check("任意前端传入字段")

注意
最好的预防方式仍旧是不允许任何SQL片段由前端传到后台,我们强烈建议不要开放给前端太多的动态 SQL,这样最安全。

三、关于恶意漏洞的说明

MyBatis-Plus 相关的代码和 Jar 包被别有用心的人提交了 CVE 漏洞,下面对这些漏洞进行一下官方的声明。

提醒! 请您注意这种不被官方认可的 “CVE 漏洞” 对框架本身、对用户、对项目的交付都会产生非常大的影响,您的 损人不利己的行为 给别人带来非常大的经济损失。

如果是不安全的设计,最好的办法是 issue 或 pull request 协助官方尽快修复。

官方文档也 一而再 再而三 的强调 SQL 片段 必须检查安全,任何 ORM 框架,包括 JDBC 都是允许 字符串直接拼接SQL 的情况,因此,我们建议最好不要允许前端传入 SQL 片段。


总结

回到顶部

尽量避免前端传入 SQL 片段,对于前端传入的SQL片段通过手动校验的方式避免SQL注入。
常见问题章节也推荐大家去看一下,里面覆盖了很多众多业务场景的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/bicheng/45735.html

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

相关文章

基于AT89C51单片机的16×16点阵LED显示器字符滚动显示设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的1616点阵LED显示器字符滚动显示设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。 目录 仿真效果图 仿真图 代码 系统论文 资源下载 设计的内容和要求 熟悉51系…

thinkphp5多层with关联查询错误问题

官方文档 https://www.kancloud.cn/manual/thinkphp5/139045 V5.0.7版本以上,支持使用数组方式定义嵌套预载入,例如下面的预载入要同时获取用户的Profile关联模型的Phone、Job和Img子关联模型数据: $list User::with([profile>[phone,j…

TS类型声明文件(一)如何在ts npm包项目中生成 d.ts 文件

现在TS项目很多,如果你开发的npm包不支持类型声明文件,对使用ts的开发者不太友好,开发者无法获得ts类型提示。如何在自己的 npm 包中自带 .d.ts 文件,以确保使用者不需要额外配置 tsconfig.json 就能获得类型提示,以下…

Python练习题(3)

1.使用requests模块获取这个json文件http://java-api.super-yx.com/html/hello.json 2.将获取到的json转为dict 3.将dict保存为hello.json文件 4.用文件流写一个copy(src,dst)函数,复制hello.json到C:\hello.json import requests import jsondef copy(src, dst):read_file o…

【typedb】例子:药物发现 1: 模式导入

typedb-examples/drug-discovery/ Drug discovery监听0.0.0.0:1729 但这么连接肯定不行: localhost:1729 可以: 一直无法点击schema图标:先创建一个数据库 选中数据库: 选中后就可以了:

我的第128天创作纪念日

🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈初阶数据结构笔记专栏: 初阶数据结构笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章…

演示:【Avalonia-Controls】Avalonia皮肤,主题,自定义控件,数据库,系统模块资源库

一、目的:分享一个Avalonia皮肤,主题,自定义控件,数据库,系统模块资源库 开源地址: GitHub - HeBianGu/Avalonia-Controls: Avalonia控件库 Nuget包地址: NuGet Gallery | Packages matchin…

02MFC画笔/画刷/画椭圆/圆/(延时)文字

文章目录 画实心矩形自定义画布设计及使用连续画线及自定义定义变量扇形画椭圆/圆输出颜色文本定时器与定时事件 画实心矩形 自定义画布设计及使用 连续画线及自定义定义变量 扇形 画椭圆/圆 输出颜色文本 定时器与定时事件

大模型时代的目标检测

https://zhuanlan.zhihu.com/p/663703934https://zhuanlan.zhihu.com/p/6637039341.open set/open word/ood 这个任务是指在实际应用上可以检测任何前景物体,但是有些不需要预测类别,只要检测出框就行。在很多场合也有应用场景,有点像类无关…

Memcached vs Redis——Java项目缓存选择

在Java项目开发中,缓存系统作为提升性能、优化资源利用的关键技术之一,扮演着至关重要的角色。Memcached和Redis作为两种流行的缓存解决方案,各有其独特的优势和应用场景。本文旨在通过分析项目大小、用户访问量、业务复杂度以及服务器部署情…

Chubby VS Zookeeper

Chubby 和 Zookeeper 是两种分布式协调服务,主要用于管理分布式系统中的配置、同步和命名等任务。以下是对这两种系统的比较: Chubby 开发者:由 Google 开发和使用,作为其内部服务的一部分。 设计目标:为 Google 的…

ABAP中将采购订单的预制发票过账的BAPI的使用方法

在ABAP中,将采购订单的预制发票过账的BAPI主要是BAPI_INCOMINGINVOICE_POST。这个BAPI用于将之前通过BAPI_INCOMINGINVOICE_PARK等函数创建的预制发票过账到SAP系统中,生成相应的会计凭证。 使用方法 以下是使用BAPI_INCOMINGINVOICE_POST的基本步骤&a…

力扣 爬楼梯

动态规划算法基础篇。 class Solution {public int climbStairs(int n) {int[] f new int[n 1];f[0] 1;f[1] 1;//当爬到n阶楼梯时&#xff0c;可知是由n-1阶或n-2阶楼梯而来for(int i 2; i < n; i) {f[i] f[i - 1] f[i - 2];//后面的每一阶种数由前两个状态得到}ret…

Milvus 核心设计 (3) ---- metric及index原理详解与示例(1)

目录 背景 Floating point embeddings 特点 适用场景 丈量方式 Euclidean distance (L2) Inner product (IP) Cosine similarity (COSINE) 代码写法 索引类型 In-Memory FLAT 索引 IVF_FLAT IVF_FLAT的工作流程 平衡准确性与速度 性能考虑 代码写法 IVF_SQ8 …

栈和队列 OJ (一)

括号匹配问题 题目链接&#xff1a; https://leetcode.cn/problems/valid-parentheses/ 遇到左括号入栈&#xff0c;遇到右括号&#xff0c;我们就出栈看看括号是否匹配 这里要注意如果左括号多于右括号的情况下&#xff0c;字符串循环遍历结束时&#xff0c;栈不为空&#x…

Android --- Kotlin学习之路:自己写一个SDK给别的APP用(暴漏一个接口,提供学生的身高数据)

今天又来肝kotlin了&#xff0c;主题是&#xff1a;用kt写一个SDK给其他人用&#xff0c;这个小技能在项目中会经常用到&#xff0c;应该有很多小伙伴还不会用&#xff0c;不会的请往下看—⬇ 在项目里面新建一个module 选择Android library&#xff0c;然后点击finish就行了 …

React有哪些优点和缺点

React 作为一个广泛使用的 JavaScript 库&#xff0c;在前端开发领域具有显著的优点&#xff0c;但同时也存在一些缺点。以下是对 React 的一些主要优点和缺点的概述&#xff1a; 优点 组件化开发&#xff1a; React 鼓励将 UI 分解为小的、独立的、可复用的组件。这种方式使得…

PostgreSQL UPDATE 命令

PostgreSQL UPDATE 命令 PostgreSQL 是一种功能强大的开源对象关系型数据库管理系统(ORDBMS),它使用并扩展了SQL语言。在处理数据库时,我们经常需要更新现有的记录。在PostgreSQL中,UPDATE命令用于修改表中的现有记录。 基本语法 UPDATE命令的基本语法如下: UPDATE t…

常用的内部排序算法

常用的内部排序算法 简单选择排序、直接插入排序和冒泡排序、折半插入排序、希尔排序算法、快速排序算法&#xff08;递归和非递归&#xff09;、堆排序 运行结果&#xff1a; python 输入数据15,5,6,7,8,9,10 [外链图片转存中…(img-60STknHj-1720750359076)] [外链图片转…

【Java】二维数组

文章目录 一、什么是二维数组二、二维数组的声明形式三、二维数组的创建(1)静态初始化(2)动态初始化 四、二维数组的输入五、二维数组在内存中的存储方式 一、什么是二维数组 一维数组的声明是int[] arr&#xff0c;int[] arr {0,1,2,3,…};通过一维数组的形式和表达式 我们…