MyBatis进阶:告别SQL注入!MyBatis分页与特殊字符的正确使用方式

 

目录

引言

一、使用正确的方式实现分页

1.1.什么是分页

1.2.MyBatis中的分页实现方式

1.3.避免SQL注入的技巧

二、特殊字符的正确使用方式

2.1.什么是特殊字符

2.2.特殊字符在SQL查询中的作用

2.3.如何避免特殊字符引起的问题

2.3.1.使用CDATA区段 

2.3.2.使用实体引用

三、总结和展望 

3.1.MyBatis的优点和不足 

优点

不足之处

3.2.未来发展趋势和应用场景


引言

SQL注入是一种常见的数据库攻击手段,它利用了程序员在编写代码时疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。举个例子,如果一个网站没有对用户输入的字符串进行过滤、转义、限制或处理不严谨,那么攻击者就可以通过输入精心构造的字符串去非法获取到数据库中的数据  。

SQL注入的坏处包括但不限于:窃取敏感信息、破坏数据、影响系统稳定性等  。

SQL注入案例:

当用户输入的数据直接拼接到SQL语句中时,如果用户输入恶意数据,例如 ' OR '1'='1,那么整个SQL语句会变成:

SELECT * FROM users WHERE name = '' OR '1'='1';

由于1=1 永远为真,所以这个SQL语句会返回所有用户记录。这就是一个典型的SQL注入攻击。如果使用MyBatis的动态SQL功能,用户可以在查询语句中直接输入变量名,而MyBatis会将这些变量替换为对应的值。如果用户输入的值包含恶意代码,那么就会导致SQL注入问题。

下面来看看我们怎么解决的吧!!👇👇

一、使用正确的方式实现分页

1.1.什么是分页

分页是一种操作系统里存储器管理的一种技术,可以使电脑的主存可以使用存储在辅助存储器中的数据。操作系统会将辅助存储器(通常是磁盘)中的数据分区成固定大小的区块,称为“页”。当不需要时,将当前访问的页从内存中换出,放入磁盘中,以便下次访问时再将其读入内存。这样,每次只需要读取所需的那一页数据,就可以避免一次性读取大量数据导致内存不足的问题。

举个例子,如果我们需要在一个网站上查看文章列表,但是每篇文章都有很多内容,如果我们一次性将所有文章全部加载到浏览器中,那么可能会导致浏览器崩溃。而如果我们使用分页技术,每次只加载一篇文章的内容,这样就可以避免这个问题。

MyBatis分页插件提供了多种分页方式,可以满足不同场景下的需求。例如,可以使用物理分页和逻辑分页两种方式来实现分页查询。物理分页是指将数据分成固定大小的块进行查询,而逻辑分页则是根据用户需求进行查询。使用MyBatis分页插件可以方便地实现这些功能,并且可以避免SQL注入等安全问题。

1.2.MyBatis中的分页实现方式

MyBatis中有多种分页实现方式,其中比较常用的有以下几种:

        1.物理分页:将数据分成固定大小的块进行查询。这种方式的优点是速度快,但是缺点是占用内存大,不适用于数据量大的情况。

<select id="selectUsersByPage" parameterType="map" resultType="User">SELECT * FROM userLIMIT #{start}, #{size}
</select>

        2.逻辑分页:根据用户需求进行查询。这种方式的优点是可以根据用户需求进行查询,灵活性高,但是缺点是需要手动编写SQL语句,维护成本高。

public List<User> selectUsersByPage(int pageNum, int pageSize) {int start = (pageNum - 1) * pageSize;int end = start + pageSize;List<User> users = userMapper.selectAllUsers();if (start < users.size()) {users = users.subList(start, end);}return users;
}

        3.MyBatis分页插件:提供了多种分页方式,可以满足不同场景下的需求。例如,可以使用物理分页和逻辑分页两种方式来实现分页查询。使用MyBatis分页插件可以方便地实现这些功能,并且可以避免SQL注入等安全问题。

我接下来要介绍的是第三种方式MyBatis分页插件,利用插件完成分页共有以下四步:

①导入pom依赖

 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.2</version></dependency>

②Mybatis.cfg.xml配置拦截器

<plugins><!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 --><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

注意事项:该标签不能写在<environments>后面,因为该文件的DTD约束了每个标签的先后顺序

③使用PageHelper进行分页

BookMapper.xml

<select id="listPager" resultType="com.csdn.xw.model.Book" parameterType="java.lang.String">select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
</select>

BookMapper

 List<Book> listPager(@Param("bname") String bname);

BookBiz

List<Book> listPager(String bname);

BookBizImpl

package com.csdn.xw.biz.Impl;import com.csdn.xw.biz.BookBiz;
import com.csdn.xw.mapper.BookMapper;
import com.csdn.xw.model.Book;import java.util.List;/*** @author Java方文山* @compay csdn_Java方文山* @create 2023-08-19-13:41*/
public class BookBizImpl implements BookBiz {private BookMapper bookMapper;public BookMapper getBookMapper() {return bookMapper;}public void setBookMapper(BookMapper bookMapper) {this.bookMapper = bookMapper;}@Overridepublic List<Book> listPager(String bname) {return bookMapper.listPager(bname);}
}

BookBizImplTest

package demo;import com.csdn.xw.biz.Impl.BookBizImpl;
import com.csdn.xw.mapper.BookMapper;
import com.csdn.xw.util.SessionUtil;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.util.Arrays;
import java.util.List;/*** @author Java方文山* @compay csdn_Java方文山* @create 2023-08-19-13:46*/
public class demo1 {private BookBizImpl bookBiz = new BookBizImpl();SqlSession sqlSession;@Beforepublic void setUp() throws Exception {System.out.println("初始换方法。。。");//工具类中获取session对象sqlSession = SessionUtil.openSession();//从session对象中获取mapper对象BookMapper mapper = sqlSession.getMapper(BookMapper.class);bookBiz.setBookMapper(mapper);}@Afterpublic void tearDown() throws Exception {System.out.println("方法测试结束。。");sqlSession.commit();}@Testpublic void listPager() {System.out.println("测试的mybatis的分页插件方法");PageHelper.startPage(1, 10); // 第1页,每页10条数据System.out.println("当前页数:"+PageHelper.getLocalPage().getPageNum()+"当前页展示数:"+PageHelper.getLocalPage().getEndRow());bookBiz.listPager("圣墟").forEach(System.out::println);}}

④处理分页结果

 

1.3.避免SQL注入的技巧

  1. 使用参数化查询:使用参数化查询是防止SQL注入的最有效方法之一。通过将查询参数化,将用户提供的输入值作为参数传递给查询,而不是将输入值直接拼接到SQL语句中。这样可以确保输入值被正确地转义和处理,减少SQL注入的风险。

  2. 使用存储过程:存储过程是一种在数据库中预编译的SQL代码块,可以通过调用存储过程来执行SQL操作。使用存储过程可以避免SQL注入,因为它们不允许用户直接输入数据,而是使用预先定义好的参数来传递数据。

  3. 过滤用户输入:对用户输入进行过滤和验证,确保输入数据的合法性。例如,可以使用正则表达式或白名单来限制用户输入的字符集,或者限制输入长度等。

二、特殊字符的正确使用方式

2.1.什么是特殊字符

在Mybatis中,特殊字符是指在XML文件中需要转义的字符。这些字符包括:&、<、>、"、'、/等。为了避免这些字符对XML文件造成影响,我们需要对它们进行转义。

2.2.特殊字符在SQL查询中的作用

在SQL查询中,特殊字符可以用来进行模糊查询。其中,%表示任何字符出现任意次数(可以是0次),而_表示一个字符。除此之外,还有一些其他的字符,比如[]^\\等等,它们也可以用来进行模糊查询。

例如,假设有一个名为"users"的表,其中包含一个名为"name"的列,我们可以使用以下语句来查找名字以字母"A"开头的所有用户:

SELECT * FROM users WHERE name LIKE 'A%';

这将返回所有名字以字母"A"开头的用户。另外,如果我们想要查找名字中包含两个字母"A"的用户,我们可以使用以下语句:

SELECT * FROM users WHERE name LIKE '%A%A%';

2.3.如何避免特殊字符引起的问题

先来一个没有特殊处理过的

BookMapper.xml

<select id="listPagerS" resultType="com.csdn.xw.model.Book" parameterType="java.util.Map">select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%') and price < #{max}
</select>

BookBizImplTest 

 @Testpublic void listPagerS() {System.out.println("没有处理特殊字符之前");Map map=new HashMap();map.put("dname","圣墟");map.put("max",20);bookBiz.listPagerS(map).forEach(System.out::println);}

测试结果:

直接报红了,因为有些特殊字符是需要处理的,下面我来给大家介绍两种处理方案:

2.3.1.使用CDATA区段 

CDATA区段是XML中的一个元素,它包含了不会被解析器解析的文本。一个CDATA区段中的标签不会被视为标记,同时实体也不会被展开。主要的目的是为了包含诸如XML片段之类的材料,而无需转义所有的分隔符 。

我们只需在需要有特殊字符的地方加上<![CDATA[ "含带特殊字符"]]>即可

BookMapper.xml

  <select id="listPagerS" resultType="com.csdn.xw.model.Book" parameterType="java.util.Map">select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%') and <![CDATA[  price <#{max}]]>
</select>

这时候再来看看效果:

2.3.2.使用实体引用

在XML中,一些字符具有特殊的意义,比如<>&等符号。如果我们需要在文本中使用这些符号,就需要将它们转义为对应的实体引用。例如,<应该被转义为&lt;>应该被转义为&gt;&应该被转义为&amp;

BookMapper.xml

 <select id="listPagerS" resultType="com.csdn.xw.model.Book" parameterType="java.util.Map">select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%') and   price &gt; #{max}
</select>

测试效果:

以下是一些常见的需要转义的XML特殊字符及其对应的实体引用: 

特殊字符实体引用
<&lt;
>&gt;
&&amp;
"&quot;
'&apos;
/&#x2F;
\&#x5C;
"&quot;
'&apos;

 

三、总结和展望 

3.1.MyBatis的优点和不足 

优点

  1. 灵活:MyBatis提供了高度可配置的选项来满足不同需求,支持多种数据库和数据源。
  2. 易于使用:MyBatis提供了简单直观的SQL映射文件和接口,使得开发人员能够快速上手并编写高效的SQL语句。
  3. 解耦性高:MyBatis将SQL语句与Java代码分离,使得开发人员可以专注于业务逻辑的开发,而不需要关心底层的数据访问细节。
  4. 缓存支持:MyBatis提供了一级缓存和二级缓存的支持,可以提高查询性能。
  5. 动态SQL:MyBatis支持动态SQL,可以根据不同的条件生成不同的SQL语句,提高了SQL语句的灵活性。

不足之处

  1. 学习曲线较陡峭:相对于其他持久层框架,MyBatis的学习曲线较为陡峭,需要一定的时间来熟悉其配置和使用方式。
  2. XML配置文件复杂:MyBatis使用XML配置文件来定义SQL映射关系,对于复杂的SQL语句和大量的映射关系,XML配置文件可能会变得冗长且难以维护。
  3. SQL语句优化困难:由于MyBatis将SQL语句与Java代码分离,对于复杂的SQL语句优化可能需要额外的工作。

3.2.未来发展趋势和应用场景

  1. 自动化生成:随着AI技术的发展,MyBatis有望通过自动化生成技术减少手动编写SQL语句的工作量,提高开发效率。
  2. 插件化扩展:MyBatis可以通过插件化的方式扩展其功能,满足不同场景的需求,如分页插件、缓存插件等。
  3. 云原生支持:随着云计算的普及,MyBatis可以进一步提供云原生的支持,如容器化部署、微服务架构等。
  4. 多租户支持:随着多租户应用的兴起,MyBatis可以提供更好的多租户支持,如数据隔离、权限控制等。
  5. 大数据处理:MyBatis可以结合大数据处理框架(如Spark、Flink)进行大规模数据的处理和分析。
  6. 低代码开发平台:随着低代码开发平台的兴起,MyBatis可以作为其核心组件之一,提供快速搭建数据模型和数据访问的能力。

综上所述,MyBatis作为一种优秀的持久层框架,在未来将继续发挥重要作用。虽然存在一些不足之处,但随着技术的不断发展和创新,相信MyBatis将会不断改进和完善,为开发者提供更多便利和支持。

到这里我的分享就结束了,欢迎到评论区探讨交流!!

如果觉得有用的话还请点个赞吧 ♥  ♥

 

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

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

相关文章

怎么做出老板看得懂的财务数据分析报表?

财务数据分析报表的主要作用就是为决策提供必不可少的数据信息&#xff0c;让老板以及管理层在充分了解企业现金流情况、债务能力、还债能力、进账情况等财务信息后&#xff0c;更科学地做出运营管理决策。因此&#xff0c;财务数据分析报表必须做得直观易懂&#xff0c;毕竟不…

Qt与电脑管家3

1.ui页面设计技巧 最外面的widget&#xff1a; 上下左右的margin都置相同的值 这里有4个widget&#xff0c;做好一个后&#xff0c;后面3个可以直接复制.ui文件&#xff0c;然后进行微调即可。 2.现阶段实现的效果&#xff1a; 3.程序结构&#xff1a; btn1--->btn btn1---…

【第三阶段】kotlin语言的内置函数takeif

package Stage3fun main() {println(checkPermission("root","123")) }//检查校验 //username.takeif{true/false} true:返回username本身 false:返回nullfun checkPermission(userame:String,pwd:String):String{return userame.takeIf { permissionSy…

【QT5-自我学习-线程qThread移植与使用-通过代码完成自己需要功能-移植小记3】

【QT5-自我学习-线程qThread移植与使用-通过代码完成自己需要功能-移植小记3】 1、前言2、实验环境3、自我总结&#xff08;1&#xff09;文件的编写&#xff08;2&#xff09;信号与槽的新理解&#xff08;3&#xff09;线程数据的传递 4、移植步骤第一步&#xff1a;添加新文…

4、Spring_IOC注解开发

IOC 注解开发 版本了解 2.0版本时开始支持注解开发&#xff08;2.0之前就是昨天学习的纯 xml 操作&#xff09;2.5版本才完善3.0版本支持纯注解开发 1.注解&xml配置Bean 1.1配置用户mapper 配置 mapper public interface UserMapper {void save(); }配置 mapper 实现类…

1.文章复现《热电联产系统在区域综合能源系统中的定容选址研究》(附matlab程序)

0.代码链接 文章复现《热电联产系统在区域综合能源系统中的定容选址研究》&#xff08;matlab程序&#xff09;-Matlab文档类资源-CSDN文库 1.简述 本文采用遗传算法的方式进行了下述文章的复现并采用电-热节点的方式进行了潮流计算以降低电网的网络损耗 分析了电网的基本数…

如何更高效的写出更健全的代码,一篇文章教会你如何拥有一个良好的代码风格

前言&#xff1a;在平常的写代码的过程中&#xff0c;或多或少的遇到很多奇怪的 bug &#xff0c;尤其是一些大的程序&#xff0c;明明上一部分都是好好的&#xff0c;写下一块的时候突然多几百个 bug 的情况&#xff0c;然后这一块写完了后编译的时候直接傻眼了&#xff0c;看…

8、Vue 核心技术与实战 智慧商城项目 DAY8~10

1、 项目演示 2、 项目收获 3、 创建项目 4、调整初始化目录 1、删掉&#xff08;1&#xff09;assets中的文件&#xff08;2&#xff09;components中的文件&#xff08;3&#xff09;views中的文件2、(1)修改路由配置&#xff0c;默认的路由是个空数组即可&#xff0c;把路由…

SqlServer2019—解决SQL Server 无法连接127.0.0.1的问题

1、打开SQL Server 2019配置管理器 2、SQL Servere 网络配置(启用 Named Pipes 和 TCP/IP) 3、修改TCP/IP协议(右键选择属性—IP地址)&#xff0c;具体如下图所示&#xff1a; 4、重启SQL Server服务

【瑞吉外卖】所遇问题及解决方法

太菜了实习之余瑞吉外卖补充一下基础知识&#xff08;&#xff0c;不然真啥也不会了。 请输入正确的手机号&#xff01; 是因为我测试了我的手机号&#xff0c;爆红&#xff0c;以为方法有错。但其实是前端代码检查手机号是否符合规范的语句有点&#xff08;&#xff09;啊啊…

PyTorch训练简单的生成对抗网络GAN

文章目录 原理代码结果参考 原理 同时训练两个网络&#xff1a;辨别器Discriminator 和 生成器Generator Generator是 造假者&#xff0c;用来生成假数据。 Discriminator 是警察&#xff0c;尽可能的分辨出来哪些是造假的&#xff0c;哪些是真实的数据。 目的&#xff1a;使…

[LeetCode周赛复盘] 第 111 场双周赛20230819

[LeetCode周赛复盘] 第 111 场双周赛20230819 一、本周周赛总结2824. 统计和小于目标的下标对数目1. 题目描述2. 思路分析3. 代码实现 2825. 循环增长使字符串子序列等于另一个字符串1. 题目描述2. 思路分析3. 代码实现 2826. 将三个组排序1. 题目描述2. 思路分析3. 代码实现 …

js、PHP连接外卖小票机打印机方案(调用佳博、芯烨等)

前言&#xff1a; 目前开发需要用到电脑直接连接外卖小票机打印小票&#xff0c;查阅各种资料&#xff0c;使用 6612345浏览器 终于解决了这个问题。 效果&#xff1a; PHP、js直接连接小票机并且自动出票。 支持的小票机&#xff1a; 目前测试可以的有&#xff1a;电脑A4打印…

SQL注入读写文件

文章目录 条件利用SQL注入漏洞读取hosts文件查看文件读写权限安全选项允许导入导出读取hosts文件 利用SQL注入漏洞写入一句话木马&#xff0c;并用蚁剑连接webshell写入文件 条件 SQL注入有直接SQL注入&#xff0c;也有文件读写时的注入&#xff0c;后者的主要 目的在于获取web…

回归预测 | MATLAB实现PSO-RF粒子群优化算法优化随机森林算法多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现PSO-RF粒子群优化算法优化随机森林算法多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现PSO-RF粒子群优化算法优化随机森林算法多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果…

嵌入式Linux开发实操(十一):ETH网络接口开发

# 前言 嵌入式linux也有些是支持网口的,比如RGMII,嵌入式系统资源支持以太网和其他基本接口的硬件平台(板上或片上系统),有充足的NOR或NAND Flash闪存,用于容纳OS、lib库、fileSystem文件系统、APP应用程序、Bootloader引导程序等。嵌入式Linux是开源的、可修改的,并且…

个人微信AI聊天机器人

个人微信AI聊天机器人 微信AI机器人介绍产品介绍联系本人微信&#xff1a;yao_you_meng_xiang代码地址&#xff1a;https://github.com/xshxsh/weChatAiRobot 前期准备个人微信号Windows电脑注册AI模型账号 搭建使用注册AI账号注册讯飞账号创建应用申请API使用 安装微信 安装代…

【网络安全】防火墙知识点全面图解(三)

本系列文章包含&#xff1a; 【网络安全】防火墙知识点全面图解&#xff08;一&#xff09;【网络安全】防火墙知识点全面图解&#xff08;二&#xff09;【网络安全】防火墙知识点全面图解&#xff08;三&#xff09; 防火墙知识点全面图解&#xff08;三&#xff09; 39、什…

解决idea登录github copilot报错问题

试了好多方案都没用&#xff0c;但是这个有用&#xff0c; 打开idea-help-edit custonm vm options 然后在这个文件里面输入 -Dcopilot.agent.disabledtrue再打开 https://github.com/settings/copilot 把这个设置成allow&#xff0c;然后重新尝试登录copilot就行就行 解决方…

nginx代理请求到内网不同服务器

需求&#xff1a;之前用的是frp做的内网穿透&#xff0c;但是每次电脑断电重启&#xff0c;路由或者端口会冲突&#xff0c;现在使用汉土云盒替换frp。 需要把公网ip映射到任意一台内网服务器上&#xff0c;然后在这台内网服务器上用Nginx做代理即可访问内网其它服务器&#xf…