千家信息网

Mybatis中#和$的区别是什么

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,这篇文章主要介绍"Mybatis中#和$的区别是什么",在日常操作中,相信很多人在Mybatis中#和$的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Myb
千家信息网最后更新 2025年01月21日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安全错误 数据库的锁怎样保障安全 软件开发详细报告 arm架构服务器操作系统有哪些 ETC缴费下载什么软件开发票 网络安全的安全和漏洞和后门 2021国内医药互联网数据库 服务器安全狗 4.0 农业银行天津软件开发中心 没有数据库的系统的概要设计 武汉熙宁网络技术有限责任公司 网信办网络安全宣传周活动 后台服务器怎么选 云南网络技术开发采购 取10至10之间的数据库 小程序云开发数据库更新记录 大唐软件开发费用 我的世界服务器怎么管理后台 a科技团队软件开发 嵌入式软件开发的发展前景 江苏通信软件开发推广 租用一个江苏互联网服务器贵不贵 网络安全公安通报 一般工厂要不要上网络安全检测 优酷yk1路由器刷打印服务器 大案追踪网络造谣数据库 哪个数据库不是检索数据库 2b2t服务器有什么装备 网络安全应急指挥办公室 惠尔顿网络安全审计系统用处 云服务器研究 csgo社区服务器地址怎么进
0