Mybatis(0)- #{}和${}的区别And${}存在SQL注入问题

1、#{}和${}的区别是什么?

a)、#{}和${}取值方式是不同的,提示OGNL?
b)、#{}是预编译的方式、${}是动态拼接字符串的方式
c)、#{}和${}传的参数是简单类型的话,它们取值的参数名称是有区别的,也就是#{}和${}中的名称	

#{} : 如果进行简单类型(String、Date、8种基本类型的包装类)的输入映射时,#{}中参数名称 可以任意 : 如果进行简单类型( S t r i n g 、 D a t e 、 8 种基本类型的包装类)的输入映射时, {} : 如果进行简单类型(String、Date、8种基本类型的包装类)的输入映射时, :如果进行简单类型(StringDate8种基本类型的包装类)的输入映射时,{}中参数名称 必须是value

d)、${}存在SQL注入问题

${} :存在SQL注入问题 ,使用OR 1=1 关键字将查询条件忽略

e)、解析顺序不同(#{}和${}谁先解析的问题)
f)、#{}对于参数的处理,是需要根据类型来处理,比如字符串类型,处理之后,会加上双引号。而${}不管类型,内容都是原样输出

SELECT * FROM user WHERE username like '%${name}%'  and age = #{age} 
SELECT * FROM user WHERE age = #{age} and username like '%${name}%'  	

2、既然${}存在SQL注入问题,那么什么场景下使用它?

where name = ${name}		
from	${tableName}	//不能使用#
order by ${columnName}	

如果使用#{}会出现什么问题?

这里先说一下只能 的情况 , 从我们前面的例子中也能看出 , o r d e r b y 是肯定只能用 {}的情况,从我们前面的例子中也能看出,order by是肯定只能用 的情况,从我们前面的例子中也能看出,orderby是肯定只能用{}了,用#{}会多个’ '导致sql语句失效.
此外还有一个like语句后也需要用 , 简单想一下就能明白 . 由于 {},简单想一下就能明白.由于 ,简单想一下就能明白.由于{}仅仅是简单的取值,所以以前sql注入的方法适用此处,如果我们orderby语句后用了${},那么不做任何处理的时候是存在sql注入危险的.
你说怎么防止,那我只能悲惨的告诉你,你得手动处理过滤一下输入的内容,如判断一下输入的参数的长度是否正常(注入语句一般很长),更精确的过滤则可以查询一下输入的参数是否在预期的参数集合中…

group by ${columnName}

SELECT * FROM user WHERE username = #{name} and pwd = ${pwd}
SELECT * FROM user WHERE username = #{name} and pwd ='' OR 1=1

3、既然mybatis的SqlSession要求只能传入一个参数,那么以下代码如何解释?

int updateByExample(@Param("record") User record,@Param("example") UserExample example);

封装成Map对象,@Param注解中的值为key,@Param注解的参数为value
SqlSession.update(statementId,param)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值