${}和#{}的区别以及${}的sql注入问题

最近看到了这个问题,然后深入了解了一下这个sql 的注入问题,本片文章将会介绍他们的区别以及sql注入问题

一、区别

在MyBatis中,#{}和${}是两种不同的参数占位符,用于在SQL语句中引用变量或参数。它们的区别如下:

1.#{}占位符(预编译): #{}是MyBatis中的预编译占位符,它会把传入的参数值自动进行预编译处理,以防止SQL注入攻击。#{}占位符会将参数值作为一个占位符传递给数据库驱动程序,驱动程序会将其转换为一个预编译的参数并进行安全处理。在执行SQL语句时,会将参数值通过参数设置语句传递给数据库。

2.${}占位符(字符串拼接):${}是MyBatis中的字符串拼接占位符,它会直接将传入的参数值拼接到SQL语句中。${}占位符会将参数值直接替换到生成的SQL语句中,这种方式比较灵活,可以动态拼接SQL语句的各个部分。

综上所述,#{}占位符提供了更高的安全性,适合用于参数值的传递,而${}占位符具有更高的灵活性,适合用于动态拼接SQL语句的各个部分。在使用占位符时,应根据具体的需求选择合适的方式,并注意参数值的安全性。

简单来说就是#{}是预编译处理,${}是字符替换。

预编辑处理:是指 MyBatis 在处理 #{} 时,就是把 #{} 替换成了 ?号,使用 PreparedStatement 的 set 方法来赋值。也就是说 #{} 会把 {} 内的整体看成 value ,最后再给 value 加上单引号,重点强调引号内部是一个整体( #{} 不会发生 SQL 注入的根本原因)。

直接替换:是指 MyBatis 在处理 ${} 时,会把 ${} 替换成变量的值(不会加引号处理)。

二、${}的sql的注入问题

接下来我将演示${}的sql的问题

xml文件

<mapper namespace="com.caicode.dao.UserDao">
    <select id="query" resultType="com.caicode.entity.UserEntity">
        select * from user where sname = '${param1}' and spassword = '${param2}'
    </select>
</mapper>

测试程序

public static void main(String[] args) throws IOException {
        UserEntity userEntity = new UserService().queryOne("lisi","' or 1 = '1");
        System.out.println("登录状态:"+(userEntity == null?"失败":"成功"));
    }

结果

可以看到把符合结果的数据全部查询了出来,共12条

数据库

而正常来说我们一般输入的是这样的

public static void main(String[] args) throws IOException {
        UserEntity userEntity = new UserService().queryOne("zhangsan","123qwe");
        System.out.println("登录状态:"+(userEntity == null?"失败":"成功"));
    }

结果

所以为了防止这样的问题我们一般不推荐用${}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值