iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >一篇文章弄懂Mybatis中#和$的区别
  • 517
分享到

一篇文章弄懂Mybatis中#和$的区别

2024-04-02 19:04:59 517人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录前言一:下面我们写个关于“#”的个sql,看能不能注入。1.正常传参2.拼接传参二:下面我们写个关于“$”的个sql,看能不能注入。1.正常传参2.拼接传参总结前言 在学校的时候

前言

在学校的时候,想必大家肯定听老师讲过,在mybatis中,配置参数要用#,不要用$符号。因为$不安全,容易被sql注入。讲是这么讲,但是如何注入的,大家一起来看看吧。

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


 <select id="selectUser" resultMap="BaseResultMap">
    SELECT 
    	acc.user_name FROM dfws_sys_user_account AS acc
    WHERE
        acc.user_name like #{userName}
  </select>

1.正常传参


DfwsSysUserAccount user = new DfwsSysUserAccount();
user.setUserName("wanglingzhi");
List<DfwsSysUserAccount> 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<DfwsSysUserAccount> 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,看能不能注入。


<select id="selectUser" resultMap="BaseResultMap">
    SELECT 
    	acc.user_name FROM dfws_sys_user_account AS acc
    WHERE
        acc.user_name like ${userName}
  </select>

1.正常传参


DfwsSysUserAccount user = new DfwsSysUserAccount();
user.setUserName("'wanglingzhi'");
List<DfwsSysUserAccount> 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<DfwsSysUserAccount> 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中还遇到<![CDATA[]]>的用法,在该符号内的语句,将不会被当成字符串来处理,而是直接当成sql语句,比如要执行一个存储过程。

总结

到此这篇关于Mybatis中#和$区别的文章就介绍到这了,更多相关Mybatis #和$区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一篇文章弄懂Mybatis中#和$的区别

本文链接: https://www.lsjlt.com/news/160356.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一篇文章弄懂Mybatis中#和$的区别
    目录前言一:下面我们写个关于“#”的个sql,看能不能注入。1.正常传参2.拼接传参二:下面我们写个关于“$”的个sql,看能不能注入。1.正常传参2.拼接传参总结前言 在学校的时候...
    99+
    2024-04-02
  • 一篇文章弄懂C#中的async和await
    目录前言 async await 从以往知识推导 创建异步任务 创建异步任务并返回Task 异步改同步 说说 await Task 说说 async Task<TResult&...
    99+
    2024-04-02
  • 一篇文章搞懂 push_back 和 emplace_back 的区别
    push_back 和 emplace_back 本来以为自己对 push_back 和 emplace_back 的理解还行,直到我室友伦伦问了一个关于 push_back 和 emplace_back 的问题。死去的 modern ef...
    99+
    2023-08-20
    c++ java 算法
  • 一篇文章弄懂ECMAScript中的操作符
    目录一元操作符 布尔操作符 乘性操作符 加性操作符 关系操作符 相等操作符 条件操作符 赋值操作符 逗号操作符 总结一元操作符 只能操作一个值的操作符叫做一元操作符 递增和递减。递...
    99+
    2024-04-02
  • 一篇文章弄懂js中的typeof用法
    目录基础返回类型string 和 booleannumber 和 bigintsymbolundefinedfunctionobject其他常见问题引用错误typeof nullty...
    99+
    2024-04-02
  • 一篇文章弄懂Python中的内建函数
    目录前言A类B类C类D类E类F类G类H类I类L类M类R类S类T类总结前言 python内建函数指的是python自带的函数,这种函数不需要定义,并且不同的内建函数具有不同的功能,可以...
    99+
    2024-04-02
  • 一篇文章弄懂Java8中的时间处理
    目录前言LocalDateTimeZonedDateTimeInstant总结前言 java8借鉴了第三方日期库joda很多的优点 java.time包 类名描述Instant时间戳...
    99+
    2024-04-02
  • 一篇文章弄懂Java和Kotlin的泛型难点
    目录一、泛型类型 二、为什么需要泛型 三、类型擦除 四、类型擦除的后遗症 五、Kotlin 泛型 六、上界约束 七、类型通配符 & 星号投影 八、协变 & 不变 九、...
    99+
    2024-04-02
  • 一篇文章弄懂PHP和HTML的嵌套写法
    目录1.1全部php生成结构1.2html中嵌套php1.3博客项目1.3.1前后台1.3.2项目开发流程1.3.3创建数据库和表1.3.4添加博客类别1.3.5显示所有的博客类别1...
    99+
    2024-04-02
  • 一篇文章弄懂javascript内存泄漏
    1、什么是内存泄漏 在了解什么是内存泄漏之前, 我们应该要对内存是什么有个概念, 随机存取存储器(英语:Random Access Memory,缩写:RAM)是与 CPU 直接交...
    99+
    2024-04-02
  • 一篇文章彻底弄懂Python中的if __name__ == __main__
    目录1. 引言2. 特殊变量3. 复杂的例子4. 使用场景5. 解决方案6. 总结1. 引言 在Python相关代码中,我们经常会遇到如下代码段: # stuff if __name...
    99+
    2022-12-08
    Python if __name__ == __main__ if__name__=='__main__'的作用 if __name__=='__main__'
  • 一篇文章彻底弄懂Java中二叉树
    目录一、树形结构1.1 相关概念1.2树的表示形式1.3树的应用:文件系统管理(目录和文件)二、二叉树2.1相关概念2.2 二叉树的基本形态2.3 两种特殊的二叉树2.4 二叉树的性...
    99+
    2024-04-02
  • 一篇文章让你弄懂Java运算符
    目录1. 运算符是什么1.1 定义:1.2 常见运算符的概述1.3 表达式1.3.1 定义1.3.2 表达式的类型2. 算数运算符2.1 分类:2.2 基本四则运算符:加减乘除模(+...
    99+
    2024-04-02
  • 一篇文章彻底弄懂Python字符编码
    目录1. 字符编码简介1.1. ASCII1.2. MBCS1.3. Unicode2. Python2.x中的编码问题2.1. str和unicode2.2. 字符编码声明2.3....
    99+
    2024-04-02
  • 一篇文章弄懂C++左值引用和右值引用
    目录1. 左值和右值 2. 左值引用 3. 右值引用 3.1 出现 3.2 概念 3.3 应用 3.3.1 右值引用绑定到左值上 3.3.2 std::move()本质 3.3.3 ...
    99+
    2024-04-02
  • 一文弄懂MySQL中redo log与binlog的区别
    目录前言1. 什么是redo log?1.1 redo日志文件名1.2 影响redo log参数1.3 redo log大小怎么设置?2. 什么是binlog2.1 binlog文件...
    99+
    2024-04-02
  • 一篇文章弄懂Docker镜像的制作、上传、拉取和部署
    目录一、镜像(images)1. 什么是镜像?2. 镜像的组成和用途(1)Dockerfile(2)scratch(3)一个完整的操作系统需要:3. 为什么要自己制作镜像?二、镜像制...
    99+
    2024-04-02
  • 一篇文章弄懂MySQL查询语句的执行过程
    前言 需要从数据库检索某些符合要求的数据,我们很容易写出 Select A B C FROM T WHERE ID = XX  这样的SQL,那么当我们向...
    99+
    2024-04-02
  • 一文让你彻底弄懂js中undefined和null的区别
    目录前言一、基本概念1、undefined2、null二、简单区别三、表现形式1、typeof2、== 与 ===3、Object.prototype.toString.call4、...
    99+
    2024-04-02
  • 一篇文章彻底弄懂C++虚函数的实现机制
    目录1、虚函数简介2、虚函数表简介3、有继承关系的虚函数表剖析3.1、单继承无虚函数覆盖的情况3.2、单继承有虚函数覆盖的情况3.3、多重继承的情况3.4、多层继承的情况4、总结1、...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作