`
381895649
  • 浏览: 228121 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate防止SQL注入

阅读更多
Hibernate防止SQL注入

  PS:本文章来自于互联网,主要用于学习之用,无任何商业利益。如有侵权,请作者与本人联系,本人保证在24给予删除。

今天读《Hibernate In Action》,看到有关的SQL中可能被注入单引号的问题

前阶段我做完了一个系统,如果在查询字段中输入单引号"'",则会报错,这是因为输入的单引号和其他的sql组合在一起编程了一个新的sql,实际上这就是SQL注入漏洞,后来我在前台和后台都对输入的字符进行了判断。

今天看《Hibernate In Action》第七章7.1.2绑定参数时发现也提到了这一点,以下是我的简短的翻译:

永远也不要写这样的代码:

     String queryString = "from Item i where i.description like '" + searchString + "'";
     List result = session.createQuery(queryString).list();

    如果用户输入:foo' and callSomeStoredProcedure() and 'bar' = 'bar,则你的程序在执行一个简单查询后,还会调用某个存储过程,

这样你的程序就开了一个安全漏洞,如果用户偶尔输入了一个单引号,你的程序就可能报错(我的程序就这样呀!)。

     永远也不要把未经检查的用户输入的值直接传给数据库!

幸运的时有一个简单的机制可以避免这种错误:

JDBC在绑定参数时有一个安全机制,它可以准确的将那些需要转义的字符进行转义(escape),

如上面的searchString,它被escape,不再作为一个控制字符了,而是作为被查询的匹配的字符串的一部分。(这里指的是prepared statement,而是用普通的statment不行,我试过)。

另外,如果我们使用参数绑定,还可以提高数据库的执行效率,prepared statement语句被编译一次后,被放在cache中,就不再需要编译,可以提高效率。

参数绑定有2种办法:使用positional parameter或者named parameter。

Hibernate支持JDBC样式的positional parameter(查询字符串中使用?),它同使用named parameter的效果一样(查询字符串中使用:)。

使用named parameter

使用named parameter,我们重新写上面的查询语句:

String queryString = "from Item item where item.description like :searchString";

冒号后面是一个named parameter,我们可以使用Query接口将一个参数绑定到searchString参数上:

    List result = session.createQuery(queryString)
                      .setString("searchString", searchString)
                      .list();

因为searchString是一个用户输入的字符串,所以我们使用Query的setString()方法进行参数绑定,这样代码更清晰,更安全,效率更好!

如果有多个参数需要被帮定,我们这样处理:

String queryString = "from Item item "
                           + "where item.description like :searchString "
                           + "and item.date > :minDate";
List result = session.createQuery(queryString)
                  .setString("searchString", searchString)
                   .setDate("minDate", minDate)
                  .list();

使用positional parameter

    如果你喜欢,也可以使用positional parameter:

String queryString = "from Item item "
                           + "where item.description like ? "
                           + "and item.date > ?";
List result = session.createQuery(queryString)
                  .setString(0, searchString)
                  .setDate(1, minDate)
                  .list();

这段代码可读性强不如上面的强,而且可维护性差,如果我们的查询稍微改变一点,将第一个参数和第二个参数改变一下位置:

String queryString = "from Item item "
                            + "where item.date > ? "
                           + "and item.description like ?";

这样我们的代码中涉及到位置的地方都要修改,所以我们强烈建议使用named parameter方式进行参数绑定。

最后,在named parameter中可能有一个参数出现多次的情况,应该怎么处理呢?

String userSearch = "from User u where u.username like :searchString"
                           + " or u.email like :searchString";
List result = session.createQuery(userSearch)
                  .setString("searchString", searchString)
                   .list();

不要使用

为了防止SQL注入,避免使用拼凑SQL语句的方式!!!

分享到:
评论

相关推荐

    Hibernate使用中防止SQL注入的几种方案

    Hibernate使用中防止SQL注入的几种方案 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。  在获取便利操作的同时...

    hibernate注入的三种方式

    hibernate注入的三种方式

    源码基于JSP的企业级新闻系统(SSH+MYSQL).rar

    这个JSP源码是一个基于Struts2、Spring和Hibernate(SSH)框架,结合MySQL数据库的企业级新闻系统。...同时,系统对输入内容进行合法性检查,防止SQL注入等攻击。系统经过多轮测试,确保在各种环境下稳定

    sqltoy-orm框架系统-其他

    2、天然防止sql注入,执行过程 3、最强大的分页查询 4、最巧妙的缓存应用,将多表关联查询尽量变成单表 5、跨数据库 6、提供行列转换(数据旋转),避免写复杂的sql或存储过程,用算法来化解对sql的高要求,同时实现...

    基于Java的在线购物系统的设计与实现1.rar

    防止注入攻击:使用参数化查询或者ORM框架来防止SQL注入等安全漏洞。 性能优化: 缓存技术:利用缓存技术如Redis等来提升系统性能,减轻数据库负载。 异步处理:采用消息队列等技术实现异步处理,提高系统的并发...

    finance-master汇尚电子商务商品管理系统.zip

    )?简介 本平台是一个基于代码生成器的通用定制化平台,解决了在web程序再开发过程中...有效的防止了SQL注入和越级查询带来的安全问题。 ? 4)?适用范围 本开发平台,可以应用在任何J2EE项目的开发中, 一快还有更快快!

    达内java培训目录

    Spring技术 Spring Ioc基础、Ioc注入技巧、对象高级装配(自动装配、模板装配、组件扫描特性、FactoryBean、对象生命周期)、Spring AOP原理、AspectJ、Spring JDBC支持、Spring事务及安全管理;Spring整合Hibernate...

    Java常见面试题208道.docx

    115.hibernate 中如何在控制台查看打印的 sql 语句? 116.hibernate 有几种查询方式? 117.hibernate 实体类可以被定义为 final 吗? 118.在 hibernate 中使用 Integer 和 int 做映射有什么区别? 119.hibernate 是...

    DBKING使用指南

    另外,也可以在此基础上配合一定的代码来防止SQL注入的问题。 3、为各类数据库之间的数据导入导出提供高效率的工具  异构数据库的导入导出一直是个大难题,一般的工具配置复杂,尤其是不支持LOB这样的...

    springmybatis

    其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细...

    千方百计笔试题大全

    94、元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选)(D) 22 95、以下哪些属于Session的方法?(A,B,C,D,F) 22 96、Hibernate工作原理及为什么要用? 22 97、...

    java面试宝典

    94、元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选)(D) 22 95、以下哪些属于Session的方法?(A,B,C,D,F) 22 96、Hibernate工作原理及为什么要用? 22 97、...

Global site tag (gtag.js) - Google Analytics