一、Sql注入简介
Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。
例子参考:MyBatis如何防止SQL注入
二、数据库预编译为什么能防止SQL注入呢?
其实是因为SQL语句在程序运行前已经进行了预编译,在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,对应的执行计划也会缓存下来并允许数据库以参数化的形式进行查询,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令,如此,就起到了SQL注入的作用了!
2.1 无法预编译的情况
防sql注入都用参数化的方法,但是有些地方是不能参数化的。
预编译的实现方法是将参数加上引号当作字符串传输,因此凡是用到字符串但是不能带引号的地方均不可以参数化。如涉及到SQL
关键字、库名表名字段名函数名等,加上单引号代表着特定的内容,而不再是名称。
这时我们应可以使用白名单的这种针对有限集合最常用的处理办法进行处理,如果传来的参数不在白名单列表中,直接返回错误即可。
三、MyBatis如何防止SQL注入
mybatis的#{}和${}的区别
#{}:相当于JDBC中的PreparedStatement
${}:是输出变量的值
简单说,#{}是经过预编译的,是安全的;${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。