如果使用Hibernate,防止SQL注入有多安全?

14

Hibernate是否能防范SQL注入攻击?如果我使用Hibernate,那么我就完全不用担心SQL注入攻击了吗?我听说使用Hibernate执行由用户输入构建的动态SQL语句可能会允许攻击者修改语句的含义或执行任意SQL命令


据我所知,如果没有使用带有连接的本地查询,我会说是100%。 - Asad Rasheed
3
如果你没有正确编写HQL查询语句,即使是HQL也是有漏洞的。 - ManuPK
1
@ManuPK:你说得对,正如Andrew所说的那样,这总是取决于使用库的开发人员。 - Asad Rasheed
在每个人的职业生涯中,某个时刻他们并不知道什么是 SQL 注入。那种“不应该从事这项工作”的人会阻止他人学习。我们很抱歉其他人不能像您一样神奇地成为明星,但这就是为什么我们会提出问题来学习。 - KyleM
顺便说一下,我是一个很好理解SQL注入的人:我知道它是如何发生的,它是什么以及如何通过将查询语法本身与参数分离来防范它。然而,通过阅读这个帖子,我仍然对HQL(使用命名参数)的安全性做出了自己的假设,并得到了确认。你打击某人的自我提升,包括OP和我自己,尤其是在一个旨在促进自我提升的网站上,这是很无礼的。 - KyleM
1个回答

15

Hibernate是否防范SQL注入攻击?

不,它不能保护错误编写的查询语句。因此,您在编写查询语句时需要小心。始终使用准备好的语句样式,例如,请考虑下面的HQL查询:

String query1 = "select * from MyBean where id = "+ id;
String query2 = "select * from MyBean where id = :id";

查询1仍然容易受到SQL注入攻击,而查询2则不会。

简而言之,Hibernate提供了许多方法,您应该使用这些方法来保护自己免受SQL注入攻击


2
这个答案是正确的,但我的一个同事误读为“是的,Hibernate有帮助”,所以让我详细说明一下。Hibernate(特别是HQL)和SQL一样存在完全相同的问题。两者都具有参数,并且都允许字符串连接。你可以在两种情况下同样容易地搞砸它。Hibernate做了很多很棒的事情,但它不能比普通的SQL更有效地防止SQL注入攻击。 - Ryan Shillington
1
我认为提供一个指向Hibernate的“多种方式”链接比提供一个关于SQL注入的维基链接更有益。 - dev_feed
“String query2 =“ select * from MyBean where id =:id”的特殊之处是什么,使得无法发生SQL注入?在这里,我们也将字符串“id”替换为用户输入,这可能是恶意的,对吗?” - Kumar Manish

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