mybatis sql注入
Posted 神只吃苹果
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis sql注入相关的知识,希望对你有一定的参考价值。
这是${}与#{}的区别,#{}采用了预编译,在SQL执行前,会先将上面的SQL发送给数据库进行编译;执行时,直接使用编译好的SQL,替换占位符“?”就可以了。因为SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。
【底层实现原理】MyBatis是如何做到SQL预编译的呢?其实在框架底层,是JDBC中的PreparedStatement类在起作用,PreparedStatement是我们很熟悉的Statement的子类,它的对象包含了编译好的SQL语句。这种“准备好”的方式不仅能提高安全性,而且在多次执行同一个SQL时,能够提高效率。原因是SQL已编译好,再次执行时无需再编译。
${}这样格式的参数会直接参与SQL编译,从而不能避免注入攻击。
简单说,#{}是经过预编译的,是安全的;${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入
以上是关于mybatis sql注入的主要内容,如果未能解决你的问题,请参考以下文章