1.什么是sql注入
sql注入解释: 是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句去修改数据信息。
例如:"select * from user where id =" + "参数" ,然后有人而已恶意拼接参数 1;delete from user;
select * from user where id = 1;delete from user; 数据库就被恶意修改了。
2.mybaties防止sql注入用法
mybatis 提供了两种支持动态 sql 的语法 #{} 和 ${}
${} 则只是简单的字符串替换,在动态解析阶段
select * from user where id = 1;delete from user; 和拼接效果一样,有时我们在分表查询时会用到传递表名,但是由程序生成,而非用户输入
#{} 和 ${} 在预编译中的处理是不一样的。#{} 在预处理时,会把参数部分用一个占位符 ? 代替
select * from user where id = "1;delete from user;" 将所有的数据当做值来处理就防止sql的注入
#{} 的参数替换是发生在 DBMS 中,而 ${} 则发生在动态解析过程中。
3.原理
MyBatis是如何做到SQL预编译的呢?其实在框架底层,是JDBC中的PreparedStatement类在起作用,PreparedStatement是我们很熟悉的Statement的子类,
它的对象包含了编译好的SQL语句。这种“准备好”的方式不仅能提高安全性,而且在多次执行同一个SQL时,能够提高效率。原因是SQL已编译好,再次执行时无需再编译。