在 Hibernate 中防止 SQL 注入

Posted

技术标签:

【中文标题】在 Hibernate 中防止 SQL 注入【英文标题】:Prevention against SQL Injection in Hibernate 【发布时间】:2011-06-04 03:19:43 【问题描述】:

我使用hibernate与我的数据库进行交互,现在我想让我的数据库层对SQL注入安全,所以我做了一些研究,我发现我的查询应该是参数化的,这是否意味着我只是结构化我的 HQL 查询为:

List mothers = session.createQuery(
"select mother from Cat as cat join cat.mother as mother where cat.name = ?")
.setString(0, name)
.list();

然后它被参数化并保护免受 SQL 注入,或者还有其他我需要做的事情......

还提到了另一件事 - “总是逃避您的数据”如何实现??

【问题讨论】:

【参考方案1】:

我不知道setString(),但如果它与setParameter() 相同,那么是的,这样做足以防止sql注入。

更新

通过转义数据,意味着您必须确保您没有在数据库中存储危险值。

一个简单的例子是,例如,如果你传入参数

String name = "<script>alert('Hello');</script>";
//insert this name into Mother, and then when you load it from the database, it will be displayed    

List mothers = session.createQuery(
"select mother from Cat as cat join cat.mother as mother where cat.name = ?")
.setString(0, name)
.list();

到您的查询,然后下次从数据库中加载它,并在您的网络浏览器中呈现它,它将运行脚本。 您需要确保您的框架转义所有非法字符,即:将&amp;lt; 更改为&amp;lt;,然后再将其插入数据库。 如果您的框架不这样做,则必须手动进行。 有大量的库可以为您正确转义代码。例如,看看this question 和那里的答案。

【讨论】:

我查看了您提出的链接..人们建议解决 html 转义..是否需要任何其他类型的转义?? -1。转义输入数据不是预防 XSS 的好方法。更好的方法是在将不可信数据插入到如此危险的上下文(例如 HTML 页面)时转义它们,同时考虑到该上下文的规则。另见OWASP XSS Prevention Cheat Sheet。另外问题是关于 SQL 注入,而不是关于 XSS。 @axtavt 如果您阅读我在代码中的回答和评论,您会看到我提到数据必须在插入表 Mother 时进行转义。 @axtavt:Axtvt 并没有那么错:元数据表示发生变化时需要转义。 -- 我的意思是:从 Java 到 SQL 时(发送Sql 语句)你必须注意 SQL 转义,而不是 HTML 的东西。在编写 HTML 页面时,您必须注意 HTML 转义,而不是 SQL 内容。 -- 规则很简单:每次您的数据从一种上下文/风格转移到另一种时,您都必须注意转义

以上是关于在 Hibernate 中防止 SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章

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

Hibernate Criteria Api 是不是完全防止 SQL 注入

hibernate防止sql注入对参数赋值传参数的例子

如何使用 JPA 和 Hibernate 防止 SQL 注入?

spring/hibernate 如何为我们提供防止 SQL 注入的保证以及它是如何在内部处理的?

struts2防止sql注入