Mybatis中的#和$的区别
在mybatis中有两种传递值的方法,分别是用#{xxx}和${xxx}
现有sql语句查询用户做登录,使用${xxx}的话,sql语句如下
select * from user where name = ${name} and password = ${password}
用mybatis走数据库的话,可能就是
select * from user where name = 'xiaozhu' and password = '123456'
这样看似没有问题,但是如果密码传入'123456' or 1 = 1,那么sql就是
select * from user where name = 'xiaozhu' and password = '123456' or 1 = 1
造成即使密码不对也可以登录,也就是sql注入问题
解决sql注入问题最主要的解决办法就是使用数据库的预编译在mybatis中也就是使用#{},上述的sql语句如果是
select * from user where name = #{name} and password = #{password}
然后到数据库的话就是
select * from user where name = ? and password = ?
经过数据库编译后,允许以参数的形式传入进去,传入进去就只会被当做是name和password的值,也就达到了预防sql注入的问题
sql注入还可能有该表删表的操作,如果使用预编译的话,数据库会先解析传入的sql语句,后续执行的时候即使有改表操作也不会执行,会被数据库屏蔽
本文探讨了MyBatis中使用#{}

被折叠的 条评论
为什么被折叠?



