在程序中经常需要进行sql字符串拼接,但是字符串拼接存在sql注入的问题。最好用绑定变量(用?等代替占位),但是用绑定变量存在的问题是sql语句是事先固定好的,如果用户某个字段可以不输入,这个字段为null,那么就会有问题,因为不应该把这个字段加到sql里。请问,这种问题大家都怎么解决的?谢谢
例如拼接字符串:
String sql = "select * from table "
String name = 用户输入名字
if(name!=null) {
  sql+="where name='$name'";
}else{
  //不对sql进行添加限制条件
}这段代码用绑定变量形式怎么实现?如果有多个拼接条件,换成绑定变量的形式可以怎么实现?

解决方案 »

  1.   

    一般这样解决:
    List params = new ArrayList();
    String sql = "select * from table "
    String name = 用户输入名字
    if(name!=null) {
      sql+="where name=?";
      params.add(name);
    }else{
      //不对sql进行添加限制条件
    }
    PrepareStament pstm = con.createPrepareStatment(sql);
    for(int i =0 ; i < params.size(); i++){
      pstm.setString(i+1, params.get(i));
    }
    ..,,
    然后就不说了,你应该知道了。hibernate hql查不多
      

  2.   

    不晓得这样可以么!public void test(String name,String sex){
    String sql = "select * from user_info where 1 = 1 "; if(name!=null) {
    sql+="and name=?";
    }else{
    //不对sql进行添加限制条件
    }
    if(sex!=null) {
    sql+="and name=?";
    }else{
    //不对sql进行添加限制条件
    }
              //假设已经有连接
    Connection conn ;
    PreparedStatement pre=conn.prepareStatement(sql);
              //按参数顺序
    int i=0;
    if(name!=null)
    pre.setString(++i, name);
    if(sex!=null)
    pre.setString(++i, sex);
    pre.executeQuery();
    }
      

  3.   

    拼接SQL字符串并不是总是不安全,
    如果你知道该字符串是一个字段名,或者是其他你可控的语法元素,
    总之不直接来自于用户,
    那还是安全的。
      

  4.   

    如果可以用ibatis的话,这个问题就不是问题了
      

  5.   

    PrepareStament pstm = con.createPrepareStatment(sql);
    for(int i =0 ; i < params.size(); i++){
      pstm.setString(i+1, params.get(i));
    }
    这样是对的,拼接不安全,存在注入问题。。
      

  6.   


    这样对吗?如果null应该有问题吧,至少许多数据库是不能这样?
      

  7.   

    多条件查询的话拼各种组合条件的SQL就能拼死你