在程序中经常需要进行sql字符串拼接,但是字符串拼接存在sql注入的问题。最好用绑定变量(用?等代替占位),但是用绑定变量存在的问题是sql语句是事先固定好的,如果用户某个字段可以不输入,这个字段为null,那么就会有问题,因为不应该把这个字段加到sql里。请问,这种问题大家都怎么解决的?谢谢
例如拼接字符串:
String sql = "select * from table "
String name = 用户输入名字
if(name!=null) {
sql+="where name='$name'";
}else{
//不对sql进行添加限制条件
}这段代码用绑定变量形式怎么实现?如果有多个拼接条件,换成绑定变量的形式可以怎么实现?
例如拼接字符串:
String sql = "select * from table "
String name = 用户输入名字
if(name!=null) {
sql+="where name='$name'";
}else{
//不对sql进行添加限制条件
}这段代码用绑定变量形式怎么实现?如果有多个拼接条件,换成绑定变量的形式可以怎么实现?
解决方案 »
- SSH+Oracle unknown major version
- SSH 第二次跳转问题
- oracle下载安装问题
- hibernate 分页出错
- 请问如何实现对服务器传递过来的数据的动态刷新?谢谢
- 我的网站搬到北京啦!!求测试,求围观!!!!!!!
- 我的tomcat运行一段时间就自动关闭了,还要重新启动。这是为什么?是不是跟访问量有关系!!再那设置访问量?
- jsp
- Servlet.service() for servlet jsp threw exception 怎么页面很多地方都出这个错误?
- [请教]接触Struts不久,我这样的结构算不算三层结构
- 一个J2EE菜鸟遇到滴一个问题,向各位大神求解
- 请教struts2.2.3.1如何配置web.xml?
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查不多
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();
}
如果你知道该字符串是一个字段名,或者是其他你可控的语法元素,
总之不直接来自于用户,
那还是安全的。
for(int i =0 ; i < params.size(); i++){
pstm.setString(i+1, params.get(i));
}
这样是对的,拼接不安全,存在注入问题。。
这样对吗?如果null应该有问题吧,至少许多数据库是不能这样?