数据库访问接口的代码

      数据库安全课程的老师要求我们写一个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;
       }
   }
}

posted @ 2008-10-15 20:25  zhanglei_spirit  阅读(520)  评论(0编辑  收藏  举报