这段时间做项目发现了一个问题就是sql注入漏洞,最开始我根本就不知道什么是sql注入漏洞,也不知道是怎么一回事,但是问题被发现了就只有去解决啊。我百度才知道这就是一些人利用sql语句进行获取数据的一种方式。
简单来说就是当你在你的网站上根据你提供的查询条件来查询数据的时候,一些人把你的查询条件写成一些sql语句(例如:select *from XXX where 1=1...),导致数据库的数据外泄,删除等。(听说最近很火的12306网站数据泄露就是被sql注入的,当然不知道是真是假了)
既然知道有这么危险的问题,那么该怎么解决呢?当然是对你提供的查询条件进行过滤了,把一些非法的一些字符过滤掉,比如一些关键字眼:select 、alert、delete、insert、invoke等等这些DDL语句。
下面给出过滤sql注入的部分代码,有什么问题还请大家给出意见。
public String toSelectSql(String q){
if(StringUtils.isBlank(q)) return "";
char c='\\';
int cIndex=q.indexOf(c);
if(cIndex!=-1&&cIndex==0){
q=q.substring(1);
}
if(cIndex!=-1&&cIndex==q.length()-1){
q=q.substring(0,q.length()-1);
}
try {
String regular = "[\\+\\-\\&\\|\\!\\(\\)\\{\\}\\[\\]\\^\\~\\*\\?\\:\\\\]";
Pattern p = Pattern.compile(regular);
Matcher m = p.matcher(q);
String src = null;
while (m.find()) {
src = m.group();
q = q.replaceAll("\\" + src, ("\\\\" + src));
}
q = q.replaceAll("AND", "and").replaceAll("OR", "or").replace("NOT", "not");
} catch (Exception e) {
q=q;
}
return q;
}