千家信息网

Mybatis中#和$的区别是什么

发表于:2024-09-28 作者:千家信息网编辑
千家信息网最后更新 2024年09月28日,这篇文章主要介绍"Mybatis中#和$的区别是什么",在日常操作中,相信很多人在Mybatis中#和$的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Myb
千家信息网最后更新 2024年09月28日Mybatis中#和$的区别是什么

这篇文章主要介绍"Mybatis中#和$的区别是什么",在日常操作中,相信很多人在Mybatis中#和$的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Mybatis中#和$的区别是什么"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一:下面我们写个关于"#"的个sql,看能不能注入。

 

1.正常传参

DfwsSysUserAccount user = new DfwsSysUserAccount();user.setUserName("wanglingzhi");List list = userAccountService.selectUser(user);if(list!=null && list.size()>0){    for (DfwsSysUserAccount u:list) {            System.out.println("用户名:"+u.getUserName());    }}else{        System.out.println("暂无数据");}

sql打印:

Preparing: SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = ?

Parameters: wanglingzhi(String)

2.拼接传参

DfwsSysUserAccount user = new DfwsSysUserAccount();user.setUserName("'wanglingzhi' or acc.user_name = 'shuizhong'");List list = userAccountService.selectUser(user);if(list!=null && list.size()>0){    for (DfwsSysUserAccount u:list) {            System.out.println("用户名:"+u.getUserName());    }}else{        System.out.println("暂无数据");}

sql打印:

Preparing: SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = ?

Parameters: wanglingzhi or acc.user_name = shuizhong(String)

二:下面我们写个关于"$"的个sql,看能不能注入。

1.正常传参

DfwsSysUserAccount user = new DfwsSysUserAccount();user.setUserName("'wanglingzhi'");List list = userAccountService.selectUser(user);if(list!=null && list.size()>0){    for (DfwsSysUserAccount u:list) {            System.out.println("用户名:"+u.getUserName());    }}else{        System.out.println("暂无数据");}

打印sql:

SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = 'wanglingzhi'

2.拼接传参

DfwsSysUserAccount user = new DfwsSysUserAccount();user.setUserName("'wanglingzhi' or acc.user_name = 'shuizhong'");List list = userAccountService.selectUser(user);if(list!=null && list.size()>0){    for (DfwsSysUserAccount u:list) {            System.out.println("用户名:"+u.getUserName());    }}else{        System.out.println("暂无数据");}

打印sql:

SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = 'wanglingzhi' or acc.user_name = 'shuizhong'

很显然,这里已经sql注入了。

总结下,一般说来,二者的区别可总结为以下6点:

(1)#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111",如果传入的值是id,则解析成的sql为order by "id"。

(2)$将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id。

(3)#方式在很大程度上能够防止sql注入。

(4)$方式无法防止sql注入。

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

(6)一般能用#的就别用$。

ps:在使用mybatis中还遇到的用法,在该符号内的语句,将不会被当成字符串来处理,而是直接当成sql语句,比如要执行一个存储过程。

到此,关于"Mybatis中#和$的区别是什么"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

数据 用户 用户名 学习 方式 字符 字符串 更多 语句 帮助 实用 很大 接下来 一般说来 对象 引号 数据库 文章 方法 理论 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 谷歌连接不到网络服务器什么意思 三年级上册数据库查询 软件开发中心去分行 北京互联网科技有限公司在哪里 黄丽玲 网络安全 sony 音箱 添加媒体服务器 蓟州区新时代软件开发咨询报价 京东软件开发好不好 芷江鸿达网络技术服务中心 重庆戴尔服务器维修调试哪家好 软件开发过程三个阶段 服务器操作系统如何唤醒 32k服务器号码到底是多少 装数据库要重启吗 智能网络技术的例子 手机连接不上苹果服务器 校园网络安全检查总结 腾讯云服务器切换ip 知识元建模用什么数据库 分布式是基于数据库 吉林省鑫泽网络技术有限公 三星服务器内存条可以用台式机吗 数据库如何更改日期 新兴县淘正网络技术有限公司 数据库工程师认证考试 网络安全教育会心得体会 家庭网络服务器坏什么原因 检测自己电脑是否有数据库 hive数据库测试 网络造谣属于网络安全方面的吗
0