在 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();
到您的查询,然后下次从数据库中加载它,并在您的网络浏览器中呈现它,它将运行脚本。
您需要确保您的框架转义所有非法字符,即:将&lt;
更改为&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 Criteria Api 是不是完全防止 SQL 注入
如何使用 JPA 和 Hibernate 防止 SQL 注入?