mybatis动态传参#{}和${}的区别

mybatis动态传参#{}和${}的区别

#{}是PreparedStatement 可以防止sql注入
${}是Statement
详细请看下面这个帖子,很全面
https://blog.csdn.net/siwuxie095/article/details/79190856
这里说一下什么是sql注入问题

原因:

sql注入是一种常见的web漏洞问题,当前后端数据交互的时候,由于前端校验不严格,后端拿到了前端传入过来的数据直接拼接进sql语句,导致查询结果出错,这里举个例子.
当你要根据用户id这个主键值去查询用户的时候,正常的sql语句是这样的,假如id为1

select * from user where userid = 1

传入的值放前端传过来的数据,但是如果在前端输入 1 or 1=1
这样前端传过来之后后台拼接变成了

select * from user where userid = 1 or 1=1

这样就查询出来了所有的用户,造成了用户信息泄露的风险,这样的例子还有很多,这里就不一一举例.上述${}正是将参数拼接成sql语句

为什么#{}可以防止sql注入:

因为使用#{},相当于先将sql预编译,比如上述sql语句,首先进行预编译

select * from user where userid = ?

用问号将参数位置替代,这样整个语句的框架就搭好了,再将?替换成你传入的参数,如果传入参数依旧是1 or 1 = 1,这种方式不会将 or 1 = 1识别为一种条件,而是将
1 or 1 = 1整体识别为一种参数,当然查询结果也为0.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值