mysql中#{}和${}的区别详解

作者:拒绝熬夜啊 时间:2024-01-12 21:37:17 

#{}会将传入的数据当成一个字符串,会对自动传入的数据加一个双引号

order by #{userId}   
这里假如userId = 111,那么解析成sql时会变成 order by "111"
这里如果userId = idStr,那么解析成sql时会变成 order by "idStr"

${}会将传入的数据直接显示生成在sql中

order by #{userId}  
这里假如userId = 111,那么解析成sql时会变成 order by 111
这里如果userId = idStr,那么解析成sql时会变成 order by idStr

#方式能够很大程度防止sql注入;$方式无法防止Sql注入。

$方式一般用于传入数据库对象,例如传入表名。

一般能用#的就别用$。MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:

ORDER BY ${columnName}; 这里MyBatis不会修改或转义字符串。

例子:

在没有做防Sql注入的时候,我们的Sql语句可能是这么写的:

<select id="fetchStudentByName" parameterType="String" resultType="entity.StudentEntity"> SELECT id,name,age FROM student WHERE name = '${value}' </select>

mysql中#{}和${}的区别详解

但如果我们对传入的姓名参数做一些更改,比如改成anything&rsquo; OR &lsquo;x&rsquo;='x,那么拼接而成的Sql就变成了

SELECT id,name,age FROM student WHERE name = 'anything' OR 'x'='x'

mysql中#{}和${}的区别详解

库里面所有的学生信息都被拉了出来,是不是很可怕。原因就是传入的anything&rsquo; OR &lsquo;x&rsquo;='x和原有的单引号,正好组成了 &lsquo;anything&rsquo; OR &lsquo;x&rsquo;='x&rsquo;,而OR后面恒等于1,所以等于对这个库执行了查所有的操作。

防范Sql注入的话,就是要把整个anything&rsquo; OR &lsquo;x&rsquo;='x中的单引号作为参数的一部分,而不是和Sql中的单引号进行拼接

使用了#即可在Mybatis中对参数进行转义

<select id="fetchStudentByName" parameterType="String" resultType="entity.StudentEntity"> SELECT id,name,age FROM student WHERE name = #{name} </select>

我们看一下发送到数据库端的Sql语句长什么样子。

SELECT id,name,age FROM student WHERE name = 'anything\' OR \'x\'=\'x'

来源:https://blog.csdn.net/weixin_43296313/article/details/122880292

标签:mysql,#{},${}
0
投稿

猜你喜欢

  • Effective Python bytes 与 str 的区别

    2021-07-11 16:52:13
  • 一个统计当前在线用户的解决方案

    2007-10-13 19:27:00
  • matplotlib基本图形绘制操作实例

    2023-07-14 18:18:01
  • 解决MySql客户端秒退问题(找不到my.ini)

    2024-01-20 15:36:52
  • winxp 安装MYSQL 出现Error 1045 access denied 的解决方法

    2024-01-20 20:53:09
  • Python语言规范之Pylint的详细用法

    2022-11-26 03:12:25
  • Python无头爬虫下载文件的实现

    2023-11-30 03:24:00
  • Scrapy使用的基本流程与实例讲解

    2022-08-15 17:51:19
  • python实现的用于搜索文件并进行内容替换的类实例

    2022-01-07 13:50:43
  • 淘宝网提供的国内NPM镜像简介和使用方法

    2024-04-17 10:10:16
  • vuex页面刷新数据丢失问题的四种解决方式

    2024-04-09 10:58:50
  • 实现WordPress主题侧边栏切换功能的PHP脚本详解

    2024-06-05 09:23:40
  • Python字符串查找基本操作代码案例

    2023-12-03 04:04:56
  • MySQL判别InnoDB表是独立表空间还是共享表空间的方法详解

    2024-01-18 14:23:34
  • 关于页面刷新,事件重复提交的方法分享

    2023-07-06 06:50:03
  • 微信小程序调用摄像头实现拍照功能

    2024-04-19 09:51:11
  • Go语言流程控制详情

    2023-10-16 13:16:24
  • SQL0290N表空间状态问题:停顿的独占处理

    2008-12-26 17:24:00
  • Python利用matplotlib绘制约数个数统计图示例

    2023-11-12 16:00:43
  • python 从文件夹抽取图片另存的方法

    2022-08-26 13:00:55
  • asp之家 网络编程 m.aspxhome.com