欢迎来到天天文库
浏览记录
ID:34723233
大小:68.18 KB
页数:3页
时间:2019-03-10
《hibernate防止sql注入》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、【转】Hibernate防止SQL注入2009-05-1413:10今天读《HibernateInAction》,看到有关的SQL中可能被注入单引号的问题前阶段我做完了一个系统,如果在查询字段中输入单引号"'",则会报错,这是因为输入的单引号和其他的sql组合在一起编程了一个新的sql,实际上这就是SQL注入漏洞,后来我在前台和后台都对输入的字符进行了判断。今天看《HibernateInAction》第七章7.1.2绑定参数时发现也提到了这一点,以下是我的简短的翻译:永远也不要写这样的代码: StringqueryString="fromItemiwherei.de
2、scriptionlike'"+searchString+"'"; Listresult=session.createQuery(queryString).list(); 如果用户输入:foo'andcallSomeStoredProcedure()and'bar'='bar,则你的程序在执行一个简单查询后,还会调用某个存储过程,这样你的程序就开了一个安全漏洞,如果用户偶尔输入了一个单引号,你的程序就可能报错(我的程序就这样呀!)。 永远也不要把未经检查的用户输入的值直接传给数据库!幸运的时有一个简单的机制可以避免这种错误:JDBC在绑定参数时有一个安全机
3、制,它可以准确的将那些需要转义的字符进行转义(escape),如上面的searchString,它被escape,不再作为一个控制字符了,而是作为被查询的匹配的字符串的一部分。(这里指的是preparedstatement,而是用普通的statment不行,我试过)。另外,如果我们使用参数绑定,还可以提高数据库的执行效率,preparedstatement语句被编译一次后,被放在cache中,就不再需要编译,可以提高效率。参数绑定有2种办法:使用positionalparameter或者namedparameter。Hibernate支持JDBC样式的positional
4、parameter(查询字符串中使用?),它同使用namedparameter的效果一样(查询字符串中使用:)。使用namedparameter使用namedparameter,我们重新写上面的查询语句:StringqueryString="fromItemitemwhereitem.descriptionlike:searchString";冒号后面是一个namedparameter,我们可以使用Query接口将一个参数绑定到searchString参数上: Listresult=session.createQuery(queryString)
5、 .setString("searchString",searchString) .list();因为searchString是一个用户输入的字符串,所以我们使用Query的setString()方法进行参数绑定,这样代码更清晰,更安全,效率更好!如果有多个参数需要被帮定,我们这样处理:StringqueryString="fromItemitem" +"whereitem.descriptionlike:searchString"
6、 +"anditem.date>:minDate";Listresult=session.createQuery(queryString) .setString("searchString",searchString) .setDate("minDate",minDate) .list();使用positionalparameter 如果你喜欢,也可以使用positionalparameter:StringqueryString="fromItemitem
7、" +"whereitem.descriptionlike?" +"anditem.date>?";Listresult=session.createQuery(queryString) .setString(0,searchString) .setDate(1,minDate) .list();这段代码可读性强不如上面的强,而且可维
此文档下载收益归作者所有