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= ?无奈的很....
展开
 我来答
少女心Eve
2015-08-10 · 记录美好生活每一天,分享生活新鲜事。
少女心Eve
采纳数:590 获赞数:714

向TA提问 私信TA
展开全部

?的个数和标识位是不确定的,这里属于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()方法: 

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式