在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是一个用户输入的字符串,所以我们使用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();
不要使用
分享到:
相关推荐
在使用Hibernate进行数据库操作时,虽然它提供了便捷的ORM(对象关系映射)功能,但同时也需要关注SQL注入的安全问题。SQL注入是一种常见的攻击手段,攻击者可以通过输入恶意的SQL语句来篡改数据库信息,严重威胁...
针对这一问题,我们需要深入理解SQL防注入的概念、机制以及防范策略。 SQL注入的原理是,当用户通过表单、URL参数等方式提交数据到服务器时,这些数据未经处理直接拼接到SQL查询语句中。例如,一个简单的登录系统...
SQL注入漏洞是Web应用经常出现的安全问题,本文提出了在JSP开发中如何防范SQL注入的方法,以及使用ORM框架Hibernate防范SQL注入的方法。
SQL注入是一种常见的网络安全威胁,它允许攻击者通过输入恶意的SQL语句来操纵数据库系统,获取敏感信息,甚至破坏整个...通过学习和实践这些方法,我们可以有效地防止SQL注入攻击,保护我们的数据库系统免受侵害。
ORM(对象关系映射)框架如Hibernate和MyBatis能自动处理SQL注入问题,因为它们通常会使用参数化查询。例如,使用Hibernate的HQL(Hibernate Query Language): ```java Query query = session.createQuery("FROM ...
5. **使用ORM(对象关系映射)**:如Hibernate,它可以自动处理SQL,减少直接写SQL的机会,降低注入风险。 6. **应用防火墙(WAF)**:配置Web应用防火墙,检测并阻止SQL注入攻击。 7. **更新与维护**:保持应用程序...
框架如Hibernate、MyBatis等在设计时已考虑了SQL注入问题,它们会自动处理预编译语句和参数绑定,减少开发者的安全顾虑。 6. **最小权限原则**: 数据库连接应使用具有最小权限的账户,这样即使发生SQL注入,攻击...
5. **使用ORM(对象关系映射)框架**:ORM如Hibernate、Entity Framework等可以自动处理SQL语句,降低直接写SQL的机会,从而减少注入风险。 6. **Web应用防火墙(WAF)**:WAF可以识别并阻止SQL注入攻击,提供额外...
- 使用预编译语句(PreparedStatement):这是防止SQL注入最常用的方法。预编译语句会将用户输入与SQL语句分离,确保即使输入含有恶意代码,也不会被执行。例如: ```java String query = "SELECT * FROM users ...
以下是对SQL注入漏洞的全面讲解,包括其原理、防范方法以及高级技巧。 1. SQL注入漏洞原理: SQL注入的基础在于,当用户输入的数据直接拼接到SQL查询语句中,而没有经过适当的过滤或转义,攻击者可以构造特定的...
5. **使用ORM(对象关系映射)**:如Hibernate等,可减少直接SQL操作,降低注入风险。 6. **限制错误信息暴露**:避免在用户界面显示详细的错误信息,防止攻击者获取系统信息。 7. **持续更新和修复**:定期更新系统...
使用PreparedStatement是防止SQL注入最有效的方法。预编译的SQL语句在执行前会由数据库解析并创建执行计划。当设置参数时,如`PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, id);`,数据库会将...
框架如Hibernate、Entity Framework或Django ORM可以自动处理SQL语句的构建,从而降低注入风险。 7. **输入过滤**: 使用白名单或黑名单过滤输入,只允许特定的字符或值。但同样,这不应作为主要防御手段,因为它...
4. 安全模块:确保交易安全,防止恶意攻击,如密码加密、防SQL注入等。 5. 系统后台:管理员对用户、拍卖品的管理,以及统计分析等功能。 四、Hibernate在拍卖系统中的应用 1. 数据库设计:使用Hibernate的逆向工程...
防范SQL注入的方法包括: 1. 参数化查询/预编译语句:使用PreparedStatement或相似的机制,可以确保用户输入的数据不会被解释为SQL代码。 2. 输入验证:检查用户输入的数据,确保其格式符合预期,避免包含可能导致...
框架如Hibernate、MyBatis等提供了对象关系映射,它们会自动处理SQL注入问题。ORM框架通常会将用户输入转化为安全的参数,从而减少直接操作SQL语句带来的风险。 4. 最小权限原则 数据库连接应使用具有最小权限的...
3. **整合Struts和Hibernate**:整合这两者,可以在Action类中注入SessionFactory,通过Session实例化实体对象,执行数据库操作。完成操作后,这些实体对象可以通过ActionForm传递到Struts的视图层。这种方式简化了...
5. 编写业务逻辑:实现Service层和DAO层的方法,使用Hibernate进行数据库操作。 6. 创建Controller:编写处理HTTP请求的控制器,调用Service方法并返回视图。 7. 测试:通过JUnit或集成测试验证各模块功能是否正常。...
- 控制器通过Spring的依赖注入获取Hibernate的DAO对象,调用DAO方法将数据保存到数据库。 - Hibernate自动处理与数据库的交互,包括SQL语句的生成和执行。 - 保存成功后,Spring MVC控制器返回响应,EasyUI根据...