首页 > 其他分享 >关于使用#和$的使用

关于使用#和$的使用

时间:2024-03-14 17:56:05浏览次数:15  
标签:String SQL 使用 synchronization user time password 关于

#{}和${}有啥区别:

① 含义不一样:${}是直接替换,#{}是预处理;

② 使用场景不一样:普通的参数用#{},这也是我们日常用的最多的,如果是传递SQL或者SQL关键字,就用${},但需要做好安全验证

③ 安全性问题:#{}不存在安全问题,使用${}也存在安全问题,如SQL注入

SQL注入指应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者在应用程序实现定义好的查询语句的尾上添加额外的SQL语句,执行SQL成功,获取到非法数据

这里写个demo,演示下SQL注入

xml

    <select id="getUserById"  resultType="org.ongoal.tun.demos.entity.User">
        select * from user_info where user_name = '${username}' and password = '${password}'
    </select>

apifox入参

 控制台打印如下

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@18576e47] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@440a8ac2] will not be managed by Spring
==>  Preparing: select * from user_info where user_name = 'lisi' and password = '' or 1 = '1'
==> Parameters: 
<==    Columns: uid, user_name, password, manager, create_time, update_time
<==        Row: 3, lisi, 123456, 1, 2024-03-14 17:10:19, 2024-03-14 17:10:24
<==        Row: 1753297296487964673, zhangsan, bf6540446c4348b982f65cbdd1cc4522$a22ef612376787d1d3b697c95aa73be6, 0, null, null
<==        Row: 1753326948434624514, admin, 9bfaf99d54284e78a7de4b5023360ca4$70b4cbc831c70eb4557d5679fcbab939, 1, null, null
<==      Total: 3
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@18576e47]

由此就获取到了数据库所有的数据,因为最后的1=1成立,类似的还有很多

所以鉴于此,一般情况下,使用#{}去代替${}传参。

下面演示下使用使用${}放SQL关键字

serviceImpl

@Override
public List<User> getUserById(String username,String password,Integer sort) {
    String time = "";
    if (1 == sort){
        time = "create_time";
    }
    if (2 == sort){
        time = "update_time";
    }
    return deviceMapper.getUserById(username,password,time);
}

xml

<select id="getUserById"  resultType="org.ongoal.tun.demos.entity.User">
select * from user_info where user_name = #{username} and password = #{password} order by ${time} desc
</select>

apifox

 控制台

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2468e97c] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4729a351] will not be managed by Spring
==> Preparing: select * from user_info where user_name = ? and password = ? order by update_time desc  此处不是预处理,是已经直接替换
==> Parameters: lisi(String), 123456(String)
<== Columns: uid, user_name, password, age, manager, create_time, update_time
<== Row: 3, lisi, 123456, 17, 1, 2024-03-14 17:10:19, 2024-03-14 17:10:24
<== Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2468e97c]

不用在乎查询的数据是否为一条,主要看的是order by 后面的替换

 

标签:String,SQL,使用,synchronization,user,time,password,关于
From: https://www.cnblogs.com/qwg-/p/18073601

相关文章

  • 04_C++字符串_迭代器使用
    概念:迭代器是一种检查容器内元素并遍历元素的数据类型,通常用于对C++中各种容器内元素的访问,但不同的容器有不同的迭代器,初学者可以将迭代器理解为指针。1.使用迭代器使用begin和end,begin成员负责返回第一个元素(或者第一个字符)的迭代器。end成员返回指向容器“尾元素的下一个位置......
  • 远程办公、企业内网服务器的Code-Server上如何配置使用CodeGeeX插件
    很多小伙伴都会在工作中使用code-server,比如说远程办公,当你需要在家访问你的工作环境,亦或者是你们公司的Docker是放入服务器中。code-server无疑是最好的选择,它可以让你通过互联网安全地连接到远程服务器上的开发环境并且使用VSCode。这也符合code-server的初衷——能够在任何......
  • 软件测试|使用Python绘制雷达图
    前言之前用matplotlib绘制了雷达图,可能代码量会相对多一些,今天我想起了我们之前介绍过的pyecharts,这个绘图神器,也是支持绘制雷达图的,今天我们来看看实现起来会不会更简单。我们还是以买车的朋友选择来作为我们的数据进行绘制。 绘制基础雷达图pyecharts支持绘制的图形中就包......
  • RAG实战6-如何在LlamaIndex中使用自己搭建的API
    RAG实战6-如何在LlamaIndex使用自己搭建的大模型API在搭建一个大模型API服务中,我们介绍了如何使用SWIFT框架搭建一个大模型API服务。在RAG实战1-5中,我们一直使用的是本地加载大模型的方式来调用大模型,本文将介绍如何在LlamaIndex中使用自己搭建的大模型API。LlamaIndex支持部分......
  • 解决VS Code无法使用F5调试pyhton代码的问题
    不知什么原因,从2024年2月(估计时间)开始,发现VSCode无法使用F5对部分python脚本进行调试,同一个目录下的pyhton脚本有些可以用python正常调试,有些不行,特征是按下F5时,这些脚本的修改可以被保存,但是不会被执行,原因不明。目前通过查找网络资料发现了一种可行的办法,如下所示:首先,在编辑......
  • 关于小程序如何做到强制更新
    前言在小程序的日常迭代中,有一些场景我们可能需要在小程序发布后,用户能够马上感知并更新,比如上线新活动、修复高危漏洞等,如果用户因为各种原因未能及时更新小程序,这就可能导致一些功能无法正常使用或者存在安全隐患,因此,实现小程序的强制更新功能就显得尤为重要。本文将探讨小程序......
  • 关于自学\跳槽\转行做网络安全行业的一些建议
    如何自学入行?如何小白跳槽,年纪大了如何转行等类似问题,发现很多人都有这样的困惑。下面的文字其实是我以前的一个回答,就以文章的形式发出来,希望能帮助到各位读者吧~为什么我更合适回答这个问题因为我也是3年之前从小白直接跳槽到网络安全行业。当时我已经过30了。所以不......
  • Android 桌面小组件使用
    原文:Android桌面小组件使用-Stars-One的杂货小窝借助公司上的几个项目,算是学习了Android桌面小组件的用法,记下踩坑记录基本步骤1.创建小组件布局这里需要注意的事,小组件布局里不能使用自定义View,只能使用原生的组件,比如说LinearLayout,TextView,连约束布局都不能使......
  • 使用for语法打印出九九乘法表
    先打印第一列publicclassForDemo03{publicstaticvoidmain(String[]args){for(inti=1;i<=9;i++){System.out.println(1+"*"+i+"="+(1*i));//1*1~1*9}}}把固定乘数"1"用一个循环......
  • 使用 u-boot 和 rootfs/Initramfs 启动 Raspberry Pi 4
    使用u-boot和rootfs/initramfs启动RaspberryPi4B0.概述这篇文章的目的是了解嵌入式Linux的四个组成部分——工具链、引导加载程序、内核、根文件系统——通过使用最少的代码从头开始启动RaspberryPi4的命令。1.硬件要求用于编译源代码的Linux桌面计算机。......