各位给想想办法,怎样并解决sql注入那.

解决方案 »

  1.   

    用 PreparedStatement 构建sql语句
    public boolean executeSql(String strSql, Object[] param) throws Exception { boolean bRet = false;// 返回值 try {
    if (conn == null) {
    conn = getConn(connId);// 取得数据联接
    }
    ps = conn.prepareStatement(strSql);
    if (param != null) {
    for (int i = 0; i < param.length; i++) {
    ps.setObject(i + 1, param[i]);
    }
    }
    bRet = ps.execute();
    System.out.println(strSql);
    bRet = true;
    } finally {
    closeResource();
    }
    return bRet;
    }
      

  2.   

    还有其他方法吗?
    我们公司用的都是statement,
    总不能全改吧,这样不现实,
    我试过用filter过滤,但会出问题,跪求其他方法!
      

  3.   

    同2楼使有PreparedStatement 。
    public void getConn(){
    try {
    Class.forName(Driver);
    conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }

    public ResultSet execQuery(String sql,String[] params){
    getConn();
    try {
    ps = conn.prepareStatement(sql);
    if(params!=null&&params.length>0){
    for(int i=0;i<params.length;i++){
    ps.setString(i+1, params[i]);
    }
    }
    rs = ps.executeQuery();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return rs;
    }

    public int execUpdate(String sql,String[] params){
    int count = 0;
    getConn();
    try {
    ps = conn.prepareStatement(sql);
    if(params!=null&&params.length>0){
    for(int i=0;i<params.length;i++){
    ps.setString(i+1, params[i]);
    }
    }
    count = ps.executeUpdate();
    } catch (SQLException e) {
    System.err.println("SQLException: " + e.getMessage());
    if (conn != null) {
    System.err.println("Transaction is being rolled back");
    try {
    conn.rollback(); //数据库回滚
    } catch (SQLException e1) {
    e1.printStackTrace();
    }
    }
    }finally{
    closeAll();
    }
    return count;
    }

    public void closeAll(){
    try {
    if(rs!=null)
    rs.close();
    if(ps!=null)
    ps.close();
    if(conn!=null)
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
      

  4.   

    的确是这样
    statement效率低,而且不安全
      

  5.   

    你们公司都用statement???敢问,你们是啥公司啊??
    用JDBC,除非对效率非常注重的模块,都要用PreparedStatement的,好处很多
      

  6.   

    是的  现在都用PreparedStatement
      

  7.   

    StringBuffer hql = new StringBuffer(" from Service service where 1=1 ");
            Map<Object, Object> map = new HashMap<Object, Object>();
            if(searchService != null && searchService.length() != 0){
                    hql.append(" and service.a like :a ");
                    hql.append(" or service.aa like :aa ");
                    hql.append(" or service.aaa like :aaa ");
                    map.put("a", "%"+searchService+"%");
                    map.put("aa", "%"+searchService+"%");
                    map.put("aaa", "%"+searchService+"%");
                }
            }
            hql.append(" order by service.id desc ");
            List<Service> serviceList = 
                    getHibernateTemplate().getSessionFactory().getCurrentSession()
                    .createQuery(hql.toString())
                    .setProperties(map)
                    .list();
      

  8.   

    List<Service> serviceList = 
                    getHibernateTemplate().getSessionFactory().getCurrentSession()
                    .createQuery(hql.toString())
                    .setProperties(map)
                    .setFirstResult(firstResult)
                    .setMaxResults(maxResult)
                    .list();
    分页的。
      

  9.   

    List<Service> serviceList = 
                    getHibernateTemplate().getSessionFactory().getCurrentSession()
                    .createQuery(hql.toString())
                    .setProperties(map)
                    .setFirstResult(firstResult)
                    .setMaxResults(maxResult)
                    .list();
    分页的。
      

  10.   

    statement改为preparestatement,后者是前者的子类,全部改应该也很快的吧。
    用filter,过滤特殊字符,特殊字符网上查就是了。
      

  11.   

    看来是非改不可了lz,而且在Java中防止sql注入最好的方法也是PreparedStatement了