好久没考虑过的 sql 注入

很多年没考虑 sql 注入了,毕业以后 使用mybatis #{ 参数的 语法 },这个 语法已经 做了防止 sql 注入的处理 。 看到同事写的 ${ 参数 },突然 想到这个问题 。  

下面聊聊 sql注入。

总结

   ${ 参数 } 里面带有的 任何参数 都会被直接拼接到sql 里面 。

   #{ 参数 } 是 做了预编译。 后面 只能传参数。

注入的3 种方式:

原始 sql :     select * from id  = '${ id }'

 

  1 or 方式      select * from id  = ' 1 or 1=1 ' ,这样可以查询出所有 (红色 为注入部分)

    后果:可以查询到所有数据

  如果 原始 sql :select * from id  = '${ id }' and  name =1

  2 -- 注释方式:select * from id  = ' 1 or 1=1 -- ' and  name =1 (红色 为注入部分)

    后果:后面 的    name =1  的 条件被注释掉了

 

  3 ; 分割 sql    select * from id  = ' 1 ; update order set amount = 0.01 where id =1  ' (红色 为注入部分)

    后果:啥都没查询到,但是 我吧订单金额 了 

 

 

所以  使用 mybatis 尽量不要使用 ${ 参数 } 语法,不用 mybatis  应该尽量 使用 预编译的sql 。

 

posted on 2019-03-27 14:09  zhangyukun  阅读(89)  评论(0)    收藏  举报

导航