前言
面对部分必须使用${}
来输入参数的情况,需要手动进行拦截而不能使用预编译的手段。
主要需要拦截的为String
格式的字符串。
参考这篇博文:防止SQL注入的五种方法
(原文的方法似乎写的有错误,我重新整理了一下,并且添加了大小写匹配。)
我整理了一个方案:
字符串过滤方案
比较通用的一个方法:
这个函数返回值为真时表示出现敏感字符
(||之间的参数可以根据自己程序的需要添加或删除,下文只是举例)
public static boolean sql_inj(String str){
//常见可能导致误判的字符组
String inj_str = "'|and|exec|insert|select|delete|update|"
+ "count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
String inj_stra[] = inj_str.split("\\|");
//全部转换为小写进行匹配
String lowStr = str.toLowerCase();
for (int i=0 ; i < inj_stra.length ; i++ ){
if (lowStr.indexOf(inj_stra[i]) >= 0){
System.out.println(inj_stra[i]);
return true;
}
}
return false;
}
结语
测试完毕可行。
欢迎讨论其他高效的方案。