注:本文重在强调面向接口编程,而非如何防止SQL注入。
今天,在做项目时,需要增加对SQL语句的检测功能,即防止SQL注入的问题。
首先想到的是写一个工具类来完成SQL检测功能:
public class
SqlCheckUtil{
public static final String[] KEY_WORDS = { "insert", "delete", "update","select", "or", "and" };
/**
* 检测sql语句是否合法
*
* @param sql
* @return
*/
public static boolean
checkSql(String sql) {
boolean flag = true;
int size = KEY_WORDS.length;
for (int index = 0; index < size; index++) {
if (sql.contains(KEY_WORDS[index])) {
flag = false;
break;
}
}
return flag;
}
}
调用方式:
String sql ="passwd = 123 or 2 = 2";
boolean flag= SqlCheckUtil.checkSql(sql);
----------------------------------------------------------------------------------------------------------------------------------------------------------
后来想到这个功能,也可以使用接口的方式来实现:
/**
* sql语句检测接口:检测sql语句是否合法。
*
* @author leiwen
*
*/
public interface
SqlCheck {
/**
* 检测sql语句是否合法
*
* @param sql
* 需要检查的sql语句
* @return 合法返回true,不合法返回false.
*/
public boolean checkSql(String sql);
}
public class
SqlCheckImpl implements SqlCheck {
public static final String[] KEY_WORDS = { "insert", "delete", "update",
"select", "or", "and" };
/**
* 检测sql语句是否合法
*
* @param sql
* @return
*/
public boolean checkSql(String sql) {
boolean flag = true;
int size = KEY_WORDS.length;
for (int index = 0; index < size; index++) {
if (sql.contains(KEY_WORDS[index])) {
flag = false;
break;
}
}
return flag;
}
}
调用方式:
String sql ="passwd = 123 or 2 = 2";
SqlCheck sqlChek = new SqlCheckImpl();
sqlCheck.checkSql(sql);
思考:这两种方法各有什么好处呢?
------------------------------------------------------------------------------------------------------------------------------------------
以前,总想着能把自己学过的东西全面地总结一下,可是发现一个技术话题往往涉及到太多的问题,全面地分析远远超出自己的能力。
写吧,太难;不写,心又不甘。最终,还是决定以 小而实用的方式来写了。