不同点
●使用#获取传入的数据会在数据上加上引号。比如 where userId =
#{userId },如果userId传入的值为1,那最终的sql就是
where userId = “1”;
●使用$获取传入的数据不会对数据做任何改变,比如 where userId = #{userId },如果userId传入的值为1,那最终的sql就是
where userId = 1;
● #能够一定程度上防止SQL注入
● $无法防止SQL注入
● $一般用于传入数据库对象,例如传入表名。(仍会存在SQL注入问题)
使用SQL注入导致的问题
此处只举例sql注入产生的问题,至于是#导致还是$导致,自己深刻理解一下记忆会更深,这里就不过多阐述(可以实际操作一下)。
(1)基于 1=1 总为真
入参 userId ,实际传入的值 userId :100 or 1=1
sql:select * from Student where userId = 100 or 1=1;
只要传入100 or 1=1就可以查到所有学生用户信息,吐过包含敏感信息就会泄露。
(2)基于 “” = “” 总为真
入参 uesrName ,实际传入的值 userName : " or “” =";
sql: select * from user where userName = “” or “”="";
只要传入的最后结果为or “”=""(等号左右两边相等),那就任然可以查到所有数据。也会泄露。
(3)基于批量处理
入参 userId,实际参入的值userId:105;drop table user
select * from user where userId = 105; drop table user;
删除表user,很明显对数据库进行破坏,可能造成后台瘫痪。
若有写的不对的地方可以提出互相学习,哈哈