Mybatis $ 与 # 使用&SQL攻击示例

本文详细介绍了MyBatis中#与$符号在SQL参数传递中的不同作用及应用场景,强调了#对于防止SQL注入的重要性,并说明了在动态排序等特殊情况下使用$的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在整理mybatis面试题,记录下,用#{},和 ${}传参的区别。

使用场景

固定值(列名)

传入参数是,sql语句解析是会加上'*',比如

select id, username, password, email, phone, question, answer, role, create_time, update_time from mall_user where username = ? 

,传入的username为admin,那么最后打印出来的就是

select id, username, password, email, phone, question, answer, role, create_time, update_time from mall_user where username = 'admin' 

动态值

另外一种情况是,如果你要做动态的排序,比如

order by column

这个时候务必要用${},因为如果你使用了#{},那么打印出来的将会是

select * from table order by 'name' 

这样是会报错的。

目前来看,能用#就不要用$。

Mybatis中的#和$的区别

  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. 能用#就别用$;

  7. MyBatis排序时使用order by 动态参数时需要注意,用$而不是#。

SQL注入攻击

Mapper接口方法

User selectByUsername(@Param("username") String username);

XML配置

 <select id="selectByUsername" parameterType="java.lang.String" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from mall_user
    where username = ${username}
  </select>

传入参数

    @Test
    public void Mybatis01(){
        String username = "'admin' or 1 = 1";
        User admin = userMapper.selectByUsername(username);
        log.info(admin.toString());
    }

打印执行结果

==>  Preparing: select id, username, password, email, phone, question, answer, role, create_time, update_time from mall_user where username = 'admin' or 1 = 1 
==> Parameters: 
<==    Columns: id, username, password, email, phone, question, answer, role, create_time, update_time
<==        Row: 1, admin, 21232F297A57A5A743894A0E4A801FC3, admin@qq.com, null, null, null, 0, 2000-08-06 15:12:00, 2000-08-06 15:12:00
<==        Row: 2, 1234, 01044cfd18dd5c0cde26733c11a3b542, xiaogao1398@163.com, null, null, null, 1, 2021-12-26 21:31:49, 2021-12-26 21:31:49
<==        Row: 3, 高冷, 01044cfd18dd5c0cde26733c11a3b542, xiaogao13982@163.com, null, null, null, 1, 2021-12-26 21:32:06, 2021-12-26 21:32:06
<==        Row: 5, jack, e10adc3949ba59abbe56e057f20f883e, jack@qq.com, null, null, null, 1, 2022-01-14 10:15:47, 2022-01-14 10:15:47
<==        Row: 6, admin123, 21232f297a57a5a743894a0e4a801fc3, admin123@qq.com, null, null, null, 1, 2022-01-17 11:33:53, 2022-01-17 11:33:53
<==      Total: 5

攻击成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高冷小伙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值