首页 > 数据库 >MyBatis 的 # 传参,是参数化查询,那参数化查询到底为什么可以防止sql注入?

MyBatis 的 # 传参,是参数化查询,那参数化查询到底为什么可以防止sql注入?

时间:2023-09-08 15:13:31浏览次数:54  
标签:传参 查询 参数 SQL MyBatis 参数值 注入

对于 MyBatis 的 # 传参,虽然最终的 SQL 查询语句中会将参数值替换到对应的位置,但是这个过程并不是简单的字符串拼接,而是通过预编译的方式进行处理。这样做有以下几个方面的好处,从而减少了 SQL 注入的风险:

  1. 参数值转义:在参数化查询中,MyBatis 会自动对参数值进行转义处理。这样可以确保用户输入的特殊字符(如单引号、分号等)不会被误解为查询语句中的关键字符,从而防止 SQL 注入攻击。

  2. 查询计划重用:MyBatis 会将参数化查询的 SQL 语句进行预编译,将查询计划缓存起来。这样,在后续相同或类似的查询中,可以直接使用缓存的查询计划,避免了每次都重新解析 SQL 语句。这种重用查询计划的方式也增加了对 SQL 注入的防范,因为注入攻击往往需要构造新的查询语句,而预编译查询计划的复用使得攻击者难以注入恶意代码。

  3. 数据类型安全检查:MyBatis 对于参数化查询中的参数值会进行数据类型的安全检查,以确保参数的类型与数据库字段的类型匹配。这样可以防止一些类型不匹配导致的错误,同时也增加了对 SQL 注入的防御,因为注入攻击可能会尝试利用类型错误获得额外信息或执行意外的操作。

总结来说,MyBatis 的 # 传参通过参数值的转义处理、查询计划的重用和数据类型的安全检查等机制,有效地减少了 SQL 注入的风险。这种安全性的提升是由 MyBatis 框架本身来确保的,而不是简单的将参数值拼接到 SQL 语句中执行。

(相对应的,${}的形式传参,就是简单的字符串拼接,如果要用,那就要在前期自己做好各种严格校验哦)

标签:传参,查询,参数,SQL,MyBatis,参数值,注入
From: https://www.cnblogs.com/gongjing999/p/17687647.html

相关文章

  • gcc 常见编译参数
    -c只激活预处理,编译,和汇编-S只激活预处理和编译-E只激活预处理-C在预处理的时候,不删除注释信息-g只是编译器,产生调试信息。-o制定目标名称-w不生成任何警告信息。-M生成文件关联的信息。......
  • 自定义配置文件参数在application可以直接识别Not registered via @EnableConfigurati
    自定义配置文件参数在application可以直接识别Notregisteredvia@EnableConfigurationPropertiesormarkedasSpringcomponent看见很多开源项目的配置文件可以直接配置在application.yaml中,自己也想弄一个,怎么弄呢?这是我的demo,你正常ConfigurationProperties会报错Notregi......
  • potplayer软件恢复默认参数配置
    前言用该播放器播放发现灯光过曝,颜色散的比较厉害,用vlc播放没有该问题,看来问题出在配置上面配置设置开始->选项......
  • C#_防止SQL注入的参数化格式Where条件
    publicclassWhereBuilder{privatereadonlyStringBuilder_whereBuilder=newStringBuilder();privatereadonlyList<SugarParameter>_parameter=newList<SugarParameter>();publicvoidAppend(strings)=>Append(s,null,null......
  • 前端post请求用data传参数
    发post或者put请求的时候要带参数,那么就需要用data防止重复提交部分一秒钟只内只能提交一次原理如下:发了请求之后会将url和数据做一套封装,然后new一个time拿到当前时间戳从缓存里面拿到sessionObj的key,第一次拿是空的,走if的逻辑。然后把sessionObj存进去。第二次还是会去......
  • MySQL查询语句汇总附练习带注释(二)
    数据库查询语句包含条件查询语法:SELECT*/列名FROM表名WHERE条件ORDERBY列名1ASC/DESC,列名2ASC/DESC;--条件可以包含关系运算符、逻辑运算符、特殊情况等--是--在几个选项之中--betweenand在一定范围内--要求查询emp表中员工编号大于等于50的员工编号SELEC......
  • Apipost压测参数化如何使用
    Apipost7.2.1版本一键压测新增参数化功能如何使用?这里我们用一个多用户登录情况来演示,需要准备包含用户名密码的CSV文件创建CSV文件:新建一个excel表格,在表格中新建usernamepassword,在下方输入每个账号和密码保存文件时将文件类型修改为CSV保存后导入到Apipost中配置接口在接口中配......
  • @RequestBody前后端传递多个参数
    1、前端写法exportconstinsertOrUpdateVideo=(row,param)=>{returnrequest({url:'/api/video-video/insertOrUpdateVideo',method:'post',data:{uploadFileId:param.uploadFileId,video:row}})}......
  • @Scheduled注解与参数
    基本参数用法@Scheduled由Spring定义,用于将方法设置为调度任务。如:定时执行一次或定时轮询执行一段代码)参数详解1、fixedDelay上一次任务执行完毕时间点之后多长时间再执行,任务的执行要等上一个任务执行结束。@Scheduled(fixedDelay=60*60*1000)  //每隔1小时执行2、fixedRate......
  • Java系统变量参数 获取 设置 System.getProperties()
    目录1.获取2.设置3.常用参数4.Systm.getenv()与System.getProperties()区别1.获取 StringosName=System.getProperties().getProperty("os.name"); System.out.println(osName);结果输出:Windows102.设置System.setProperty("jdbc.drivers"......