Hibernate中防止SQL注入的方法

10

我使用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个回答

4
我不知道 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();

针对您的问题,下一次从数据库中加载并在您的Web浏览器中呈现时,将运行该脚本。
您需要确保您的框架转义所有非法字符,即在将其插入数据库之前将<更改为&lt;
如果您的框架没有这样做,您需要手动完成。 有很多库可以正确地为您转义代码。例如,请参阅此问题和其中的答案。


我查看了你提供的链接,人们正在建议HTML转义的解决方案。还需要其他类型的转义吗? - Juzer Arsiwala
3
转化结果:转义输入数据不是防止XSS攻击的好方法。更好的方式是在插入危险上下文(如HTML页面)时,根据该上下文的规则转义不受信任的数据。另请参见OWASP XSS预防备忘单。此外,问题是关于SQL注入而不是XSS。 - axtavt
@axtavt 如果您阅读我的回答并查看代码中的注释,您将会发现我提到数据在插入Mother表时需要进行转义。 - Shervin Asgari
1
@axtavt:Axtvt 并没有错:当元数据表示发生变化时,需要进行转义。我的意思是:从 Java 到 SQL(发送 SQL 语句)时,您必须注意 SQL 转义,但不必关心 HTML 内容。编写 HTML 页面时,您必须注意 HTML 转义,但不必关心 SQL 内容。规则很简单:每当您的数据从一个上下文/样式转移到另一个上下文/样式时,都必须注意转义。 - Ralph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接