hibernate和jdbc是怎么通过问号防止sql注入的 10
我想的是不管怎么样.你最底层都是要执行sql语句的不管你怎么写最终不都是拼一个select*fromstudentwheresno='1'这种sql语句么?我写了个程序s...
我想的是不管怎么样.你最底层都是要执行sql语句的 不管你怎么写 最终不都是拼一个
select * from student where sno = '1'
这种sql语句么?
我写了个程序
sno = "1";
sno = "1 or 1=1";
String sql = "select * from student where sno ="+sno+"";
String sql = "select * from student where sno = ?";
SQLQuery sq = dao.createSQLQuery(sql,"");
sq.setString(0, sno);
List list = sq.list();
用第一个sql拼字符串的果断把全部都查出来了
第二个绑定值的 就什么都没查出来.
不过按我上面说的 甭管什么框架最终不都是执行sql么. 只是可能 sno='1'或者 sno=1有没有那个单引号的问题. 它这种set我在网上搜是绑定值 它是怎么绑定的值?数据库的驱动直接支持的吗???我想通过日志看看怎么拼的sql语句.结果hibernte的日志只输出了一个 sno= ?无奈的很.... 展开
select * from student where sno = '1'
这种sql语句么?
我写了个程序
sno = "1";
sno = "1 or 1=1";
String sql = "select * from student where sno ="+sno+"";
String sql = "select * from student where sno = ?";
SQLQuery sq = dao.createSQLQuery(sql,"");
sq.setString(0, sno);
List list = sq.list();
用第一个sql拼字符串的果断把全部都查出来了
第二个绑定值的 就什么都没查出来.
不过按我上面说的 甭管什么框架最终不都是执行sql么. 只是可能 sno='1'或者 sno=1有没有那个单引号的问题. 它这种set我在网上搜是绑定值 它是怎么绑定的值?数据库的驱动直接支持的吗???我想通过日志看看怎么拼的sql语句.结果hibernte的日志只输出了一个 sno= ?无奈的很.... 展开
1个回答
展开全部
?的个数和标识位是不确定的,这里属于B
A、 按参数名称绑定:
B、 按参数位置邦定:
在HQL查询语句中用”?”来定义参数位置,形式如下:
Query query=session.createQuery(“from User user where user.name=? and user.age =? ”);
query.setString(0,name);
query.setInteger(1,age);
同样使用setXXX()方法设定绑定参数,只不过这时setXXX()方法的第一个参数代表邦定参数在HQL语句中出现的位置编号(由0开始编号),第二个参数仍然代表参数实际值。
注:在实际开发中,提倡使用按名称邦定命名参数,因为这不但可以提供非常好的程序可读性,而且也提高了程序的易维护性,因为当查询参数的位置发生改变时,按名称邦定名参数的方式中是不需要调整程序代码的。
C、 setParameter()方法:
D、 setProperties()方法:
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询