日期:2014-05-19  浏览次数:20895 次

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

这段代码用绑定变量形式怎么实现?如果有多个拼接条件,换成绑定变量的形式可以怎么实现?

------解决方案--------------------
一般这样解决:
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查不多
------解决方案--------------------
探讨

一般这样解决:
List params = new ArrayList();
String sql = "select * from table "
String name = 用户输入名字
if(name!=null) {
sql+="where name=?";
params.add(name);
}else{
//不对sql进行添加限制条件
}
Prepar……

------解决方案--------------------
不晓得这样可以么!
Java code

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();
}