`
kuaile863
  • 浏览: 114280 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate防注入的的方法

阅读更多

    在hibernate中有防注入的的方法这是为了避免在页面提交时给数据库带来不必要的麻烦

例如:

String sql=from table where name=‘”+name+“‘”;

那么用户输入:nan and pass =123 这样就会有安全漏洞,使程序报错。

 

Hibernate 中有一种简单的机制可以避免

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

     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是一个用户输入的字符串,所以我们使用QuerysetString()方法进行参数绑定,这样代码更清晰,更安全,效率更好!

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

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();

不要使用

 

2
0
分享到:
评论
1 楼 makemyownlife 2012-01-04  
字符串拼接是丑陋的 你总结得不错 :)

相关推荐

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

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

    JavaWeb防SQL注入的方法

    SQL注入漏洞是Web应用经常出现的安全问题,本文提出了在JSP开发中如何防范SQL注入的方法,以及使用ORM框架Hibernate防范SQL注入的方法。

    通用查询框架(hibernate+Ajax+jstl)

    基于hibernate的开源通用查询框架: 1.支持全部hql语法 2.可以支持Ajax用的 xml数据结构,也可以支持jsp、jstl、struts等标签,根据配置不同...安全稳定,防Sql注入攻击、session不关等问题。 6.开发快速,维护方便

    Hibernate 增强工具包 - 只做增强不做改变,更加精简持久层CRUD操作

    Hibernate 增强工具包 - 只做增强不做...避免Sql注入(内置对特殊字符转义,从根本上预防Sql注入攻击);无配置文件(无需编写SQL配置文件(例如:Mybatis的XML),从而简化操作);主从分离(简单配置即可实现主从分离)

    "优雅的SSM框架"进行完善(页面分离+nginx负载均衡+tomcat集群)

    Druid(数据源配置 sql防注入 sql性能监控) 前后端分离(Html替代Jsp) Nginx静态加载、负载均衡 基于keepalived的nginx高可用方案 Tomcat集群(Redis共享Session) Sping Shiro权限控制(待完善)

    JAVA制造装备物联及生产管理(ERP)系统源码

    Druid(数据源配置 sql防注入 sql性能监控) 统一的异常处理 JSP JSTL JavaScript kindeditor富文本编辑器,处理图片上传和富文本编辑 项目框架: 后台框架:spring+ springMVC + shiro + MyBatis + ...

    基于SSM框架的生产管理ERP系统源码+数据库+项目文档,含计划进度、设备管理、工艺监控、物料监控、人员监控、质量监控、系统管理

    一个生产管理ERP系统。主要包括:计划进度、设备管理、工艺监控、物料监控、...Druid(数据源配置 sql防注入 sql性能监控) 统一的异常处理 JSP JSTL JavaScript kindeditor富文本编辑器,处理图片上传和富文本编辑

    erp源码-ssm+easyUI+mysql+maven+shiro

    利用search-box实现查找功能 - [Druid(数据源配置 sql防注入 sql性能监控)](http://wosyingjun.iteye.com/blog/2306139) - 统一的异常处理 - JSP JSTL JavaScript - kindeditor富文本编辑器,处理图片上传和富文本...

    qh-erp-ssm

    erp项目 基于ssm+easyUI+...- [Druid(数据源配置 sql防注入 sql性能监控)](http://wosyingjun.iteye.com/blog/2306139) - 统一的异常处理 - JSP JSTL JavaScript - kindeditor富文本编辑器,处理图片上传和富文本编辑

    erp完整源码-ssm+easyUI+mysql+maven+shiro

    利用search-box实现查找功能 - [Druid(数据源配置 sql防注入 sql性能监控)](http://wosyingjun.iteye.com/blog/2306139) - 统一的异常处理 - JSP JSTL JavaScript - kindeditor富文本编辑器,处理图片上传和富文本...

    java ssm开发的生产管理ERP系统

    这是一个生产管理ERP系统。依托科技计划重点项目“制造装备...- [Druid(数据源配置 sql防注入 sql性能监控)] - 统一的异常处理 - JSP JSTL JavaScript - kindeditor富文本编辑器,处理图片上传和富文本编辑<!--more-->

    将优雅的SSM框架拆分为分布式架构(基于dubbo+zookeeper)+源代码+文档说明

    Druid(数据源配置 sql防注入 sql性能监控) Dubbo+Zookeeper分布式服务框架 合理的分布式服务划分(common+api+service+web) 资源调度和治理中心(SOA)(dubbo-admin) 服务监控方案(dubbo-monitor) <项目介绍> 该...

    sql字符拼接类

    简洁明了,类似于hibernate的criteria,不依赖其他任何框架和包,还具备防注入能力。我从githug找到一个原始版本,功能不完善且太复杂。我fork了自己的一个版本,有高手可以跟进下...

    基于JavaEE+SSH+shiro+easyUI的高校科研管理系统(毕业设计,含论文)

    此科研管理系统是一款基于互联网的应用,其更容易分享、升级、维护,再者我对其做了很多附加的权限控制、日志管理、防注入等措施,安全性相对较高,为身在教育科研事业一线的教师群体贴身打造。通过本管理系统可以...

    火炬博客系统7

    业务层(bussiness Layer)和持久层(Persistence Layer),使用Spring框架整合Struts和 Hibernate,用Spring的“控制反转IOC”, 或者“setter依赖注入”来操作这些对象,这些对象在一个外部的XML文件中被引用。...

    火炬博客系统6

    业务层(bussiness Layer)和持久层(Persistence Layer),使用Spring框架整合Struts和 Hibernate,用Spring的“控制反转IOC”, 或者“setter依赖注入”来操作这些对象,这些对象在一个外部的XML文件中被引用。...

    火炬博客系统5

    业务层(bussiness Layer)和持久层(Persistence Layer),使用Spring框架整合Struts和 Hibernate,用Spring的“控制反转IOC”, 或者“setter依赖注入”来操作这些对象,这些对象在一个外部的XML文件中被引用。...

    Grails 中文参考手册

    8.3 依赖注入和服务 8.4 使用Java的服务 9. 测试 9.1 单元测试 9.2 集成测试 9.3 功能测试 10. 国际化 10.1 理解信息绑定 10.2 改变Locales 10.3 读取信息 11. 安全 11.1 预防攻击 11.2 字符串的编码和解码 11.3 ...

    MF00331-JAVA制造装备物联生产管理(ERP)源码.zip

    Druid(数据源配置 sql防注入 sql性能监控) 统一的异常处理 JSP JSTL JavaScript kindeditor富文本编辑器,处理图片上传和富文本编辑 项目框架: 后台框架:spring+ springMVC + shiro + MyBatis + jsp 前台...

Global site tag (gtag.js) - Google Analytics