注:本文重在强调面向接口编程,而非如何防止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);

思考:这两种方法各有什么好处呢?

------------------------------------------------------------------------------------------------------------------------------------------

以前,总想着能把自己学过的东西全面地总结一下,可是发现一个技术话题往往涉及到太多的问题,全面地分析远远超出自己的能力。

写吧,太难;不写,心又不甘。最终,还是决定以 小而实用的方式来写了。