MyBatis数据库编写不当 会导致SQL注入漏洞

MyBatis是一个出色的分布式锁层框架,支持自己设计SQL、sql语句和高级镜像。MyBatis基本上防止了所有JDBC代码和手工设置参数并获取结果集。MyBatis能够使用简单的ASL或注解来设置和镜像本地信息内容,把普通java代码对象PlainOldjava代码Objects和java代码的接口和POJOs镜像到数据库中的记录。


MyBatis是我们所了解的,它把数据库字段名和java对象关联起来,开发者不需要关注数据库操作,直接操作java对象就能实现数据库的增删改查这些。但您还是不能防止在设置MyBatis时在ASL配置文件中编写sql语句,而且在某些情况下,假如sql语句编写得不合理,可能导致注入sql语句,那么本文将从MyBatis框架设置开始介绍SQL注入的原因和防范措施。


首先要了解MyBatis的执行过程,然后再运行它,这对编写MyBatis代码很有帮助。上边的配置文件早已提出了MyBatis须要连接数据库的信息内容,这里须要注意的一点是MyBatis不能直接对数据库进行操作,它也须要使用JDBC驱动。这些字段名提出了Mybatis到java代码的镜像文件,后面将提到这些。以上介绍了MyBatis的两种传递值方法,现在总结一下它们之间的区别:


把所有输入数据都当作字符串处理,#在自动输入数据上加上双引号。例如:backedBy#system_ID#,假如传入值为111,则解析为sql语句"111"的值为backedBy"111",假如传入值为ID,则该值为backedBy"ID"。$直接在sql语句中生成传入数据。例如:backedBy$system_ID$,假如传入值是111,那么当解析到sql语句时,这个值就是backedBysystem_ID,假如传入值是ID,那么这个解析到的sql语句就是backedByID。由于#{}实现了SQL语句的参数化,防止直接引入恶意SQL语句,因而#方法能够在很大程度上防止sql注入。


$方法未能阻止SQL注入。通常将$方法用于传入数据库对象,如传入表名称。能够使用#的一般不要使用$。因而,大部分sql注入都是由于开发人员在xml文件中使用${}传递值的方式造成的。mybatis最可能产生三种注入情况:在SQL语句中的某些部分,如backedBy字段名,表名称这些,不能使用预编译语句。此方案很容易生成SQL注入。建议开发一种java代码级别的镜像,设置一个只允许用户传入索引值的字段名/表名数组。这能够确保传入的字段名或表名位于白名单中。

分享: