`

Hibernate防止SQL注入攻击的方法如果在查询字段中输入单引号"'",则会报错,这是因为输入

阅读更多

Hibernate防止SQL注入攻击的方法如果在查询字段中输入单引号"'",则会报错,这是因为输入

Hibernate防止SQL注入攻击的方法

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

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

  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+Spring中getHibernateTemplate()返回的对象可以调用find(String queryString, Object value...Object value)来实现 named parameter。比如:

  view plain

  1. Date startTime = new Date(); 
  2. Date endTime = new Date(); 
  3. String queryString = "from SdmsRacalertLog as log where" + 
  4. " log.alertTime between :startTime and :endTime" ; 
  5. return getHibernateTemplate().find(queryString, startTime, endTime); 

 

分享到:
评论

相关推荐

    常用Sql注入语句.

    在IT安全领域,SQL注入是一种常见的攻击手段,用于利用应用程序中的漏洞来操纵或获取数据库中的敏感信息。本文将深入探讨“常用Sql注入语句”这一主题,并基于提供的资源进行详细阐述。 1. SQL注入基本原理: SQL...

    SQL注入漏洞演示源代码

    这会导致SQL查询中断,因为单引号引发了字符串结束,导致后面的`AND password = ''`被视为无效的SQL语句。攻击者可以通过这种方式绕过密码验证,因为他们“注入”了一个关闭当前条件的语句。 为了防止SQL注入,开发...

    网络攻击与防御的实例分析

    攻击者通过在输入字段中插入恶意SQL代码,使服务器执行非预期的数据库操作,从而获取敏感信息或对数据库系统进行破坏。例如,当一个网站的登录表单没有正确过滤输入,攻击者可以构造特殊的SQL语句,尝试获取或修改...

    深入了解SQL注入

    SQL注入是一种严重的网络安全威胁,它发生在Web应用程序中,当攻击者能够通过输入恶意SQL代码来操纵后端数据库时。理解并防止SQL注入至关重要,因为这种攻击可能导致数据泄露、数据破坏甚至是整个系统的瘫痪。 1. *...

    Hibernate+中文文档

    5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary ...

    hibernate3.2中文文档(chm格式)

    5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary ...

    Hibernate中文详细学习文档

    5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary ...

    Hibernate 中文 html 帮助文档

    5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database ...

    HibernateAPI中文版.chm

    5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary ...

    1000道 互联网Java工程师面试题 485页-PDF密码解除

    - 使用**#{}**时,如果入参是简单类型(如String、int等),则参数会被加上单引号;如果是数组或集合,则会转换为IN语句。 2. **实体类属性名与表字段名不一致:** - 可以通过`resultMap`中的`<result>`标签指定...

    最全Hibernate 参考文档

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 ...

    Hibernate Reference Documentation(Hibernate参考手册)

    - Hibernate支持使用SQL中的引号来标识表名、列名等,以避免关键字冲突等问题。 #### 六、模块化映射文件 - 大型项目通常会将映射信息拆分成多个XML文件,以方便管理和维护。 #### 七、集合映射 - **持久化集合*...

    Hibernate 参考文档

    - **SQL中引号包围的标识符**:如何在映射文件中引用数据库中的标识符。 - **映射文件的模块化**:将大型映射文件拆分为更小、更易于管理的部分。 #### 六、集合类(Collections)映射 - **持久化集合类(Persistent ...

    Hibernate教程

    6.3. SQL中引号包围的标识符 6.4. 其他元数据(Metadata) 6.4.1. 使用 XDoclet 标记 6.4.2. 使用 JDK 5.0 的注解(Annotation) 7. 集合类(Collections)映射 7.1. 持久化集合类(Persistent collections) 7.2. 集合...

    hibernate 体系结构与配置 参考文档(html)

    SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary ...

    Hibernate3+中文参考文档

    5.3. SQL中引号包围的标识符 5.4. 其他元数据(Metadata) 5.4.1. 使用 XDoclet 标记 5.4.2. 使用 JDK 5.0 的注解(Annotation) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射...

Global site tag (gtag.js) - Google Analytics