数据库安全课程的老师要求我们写一个SQL注入攻击和防护的代码,看了一下课件,给出了一个部分的解决方案,希望大家多提意见。
关于SQL注入中可疑输入的过滤部分,在这里就不贴代码了,因为很简单,就是一个字符串的匹配问题。关于这个接口,有如下说明:
1.该接口的编写基于以下两条防SQL注入的规则:
(1)避免使用字符串拼接的方法来构造sql语句。
(2)为不同类型的sql操作设置不同的权限。
代码如下:
package zhanglei.SQLInjection;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class DBHelper {
private Connection conn; //这里把sql相关的类都做成了DBConn的属性
private static String driverName;
private static String path;
private static Properties prop;
private int rank;
static{
getConfigOfDB();
}
/**
/*构造函数,提供的参数为当前sql操作的安全级别,对应数据库中不同权限的用户。具体的用户信息在db.config文件中进行配置
public DBHelper(int rank){
this.rank=rank;
try {
Class.forName(driverName).newInstance();
conn = DriverManager.getConnection(path,getUP(rank,1), getUP(rank,2));//1表示取出用户名,2表示取出密码
} catch (SQLException e) {
System.out.println("Connect database failed");
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
}
private static void initConfigFile(){
prop = new Properties();
try
{
FileInputStream in = new FileInputStream("E:""db.config");
prop.load(in);
in.close();
}
catch(Exception e)
{
System.out.print(e.getMessage());
}
}
private static void getConfigOfDB() {
initConfigFile();
driverName=prop.getProperty("driverName");
path=prop.getProperty("path");
prop.clear();
}
private static String getUP(int rank,int tag){
if(prop==null)initConfigFile();
if(tag==1)return prop.getProperty("name"+rank);
else return prop.getProperty("password"+rank);
}
/**
/*执行查询,要求rank大于等于5,才能进行相应的操作,
/*提供的第一个参数预编译的sql语句,第二个参数是字符串数组(此处为了简化,假定所有的字段都是字符型的)
public ResultSet executeSql(String preparedSql,String... strArray){
ResultSet rs=null;
int i=0;
if(rank<5)return null;
else{
try {
PreparedStatement psmt=conn.prepareStatement(preparedSql);
for(String str:strArray){
i++;
psmt.setString(i, str);
}
rs=psmt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
}
}