在MyBatis 的映射配置文件中,动态传递参数有两种方式:
#{} 和 ${} 的区别
1)#{} 为参数占位符 ?,即sql 预编译,变量自动加上单引号 ‘’
2)${} 为字符串替换,即 sql 拼接, 变量不会加上单引号 ‘’
一般使用#{},但在使用Mybatis的语法写动态排序时,由于#{}会导致参数带上’',所以使用${},但是又怕sql注入的问题,将传入的参数,过滤后再拼接SQL,会更安全一些。
import org.apache.commons.lang.StringUtils;
/**
* SQL过滤
*
*/
public class SQLFilter {
/**
* SQL注入过滤
* @param str 待验证的SQL字符串、参数
*/
public static String sqlInject(String str){
if(StringUtils.isBlank(str)){
return null;
}
//去掉'|"|;|\字符
str = StringUtils.replace(str, "'", "");
str = StringUtils.replace(str, "\"", "");
str = StringUtils.replace(str, ";", "");
str = StringUtils.replace(str, "\\", "");
//转换成小写
str = str.toLowerCase();
//非法字符
String[] keywords = {"master", "truncate", "insert", "select", "delete", "update", "declare", "alter", "drop"};
//判断是否包含非法字符
for(String keyword : keywords){
if(str.indexOf(keyword) != -1){
throw new RRException("包含非法字符");
}
}
return str;
}
}