欢迎光临
我们一直在努力

MyBatis #{}与${}的区别

首先,谈谈mybatis怎么防止sql注入

上述是mybatis的mapping中一段代码,当请求的时候,控制台输出

我们会发现,无论输入什么参数,打印出的sql都是这样。原因是:
mybatis启用了预编译功能,在SQL执行前,会将上面的sql发送给数据库进行编译;执行SQL的时候,直接使用预编译好的sql,传参替换占位符”?”就行。因为sql注入只能对编译过程起作用,因此,这种方式可以很好地避免sql注入问题。
mybatis底层实现原理
mybatis如何做到sql预编译?在底层框架的JDBC中的preparedStatement类起作用,该类的对象包含了许多编译好的SQL语句,这种预先编译的方式不仅能提高安全性,而且在多次执行同一个SQL的时候,能够提高效率,因为已经编译好的SQL,不需要再次编译了。
现在假设mybatis的mapping中的传参如下

执行请求时,假设传参1000000000,打印出来的SQL是这样的

结果发现传参直接显示出来,这样是无法阻止SQL注入的,在mybatis中,${xx}这种格式的参数是直接参与SQL编译,从而不能避免注入攻击。但是涉及到动态表名与列名时,只能使用${xx}这种格式参数。
总结:在编写mybatis映射语句时,尽量采用#{xx}这样的格式。简单的理解#{}是经过预编译的,是安全的;而${}是直接编译,不安全的。
现在假设必须使用${}这种方式,则我们需要手动的过滤一下内容(比如正则匹配等)。

赞(1) 打赏
未经允许不得转载:雨轩博客 » MyBatis #{}与${}的区别
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏