使用Hibernate防止SQL注入

使用Hibernate防止SQL注入,hibernate,hibernate-criteria,nhibernate-hql,Hibernate,Hibernate Criteria,Nhibernate Hql,我正在经历Hibernate,我知道您可以使用HQL阻止SQL注入: String query1 = "from Obj where id = "+ id; String query2 = "from Obj where id = :id"; query1是不安全的,而query2是安全的 如何使用条件实现安全查询?这是已经实现了还是我必须做其他事情 Criteria c = session.createCriteria(Obj.class); c.add(Restrictions.eq("i

我正在经历Hibernate,我知道您可以使用HQL阻止SQL注入:

String query1 = "from Obj where id = "+ id;
String query2 = "from Obj where id = :id";
query1
是不安全的,而
query2
是安全的

如何使用条件实现安全查询?这是已经实现了还是我必须做其他事情

Criteria c = session.createCriteria(Obj.class);
c.add(Restrictions.eq("id", 5));
我正在经历Hibernate,我知道您可以使用HQL阻止SQL注入:

String query1 = "from Obj where id = "+ id;
String query2 = "from Obj where id = :id";
一个非常常见的误解是ORM解决方案,如hibernate,是SQL注入的证明。Hibernate允许使用“原生SQL”,并定义了一种专有的查询语言,名为HQL(Hibernate查询语言);前者倾向于SQL注入,后者倾向于HQL(或ORM)注入。 资料来源:

如何使用条件实现安全查询

就后一个问题而言,CriteriaAPI(类似于PreparedStatement)会逃逸参数,不会导致恶意SQL被执行


底线是不要将应用程序的参数直接连接到查询中(并使用条件、PreparedStatement),您的应用程序是安全的。

关于SQL注入的注意事项:

由于这是一个热门话题,我现在将讨论它,但稍后将详细讨论。 Hibernate不允许SQL注入,人们可以随意滥用api。 HQL(SQL的Hibernates子集)并没有什么特别之处使它更容易受到影响

createQuery(字符串查询)和createSQLQuery(字符串查询)等函数创建一个查询对象,在调用commit()时将执行该对象。如果查询字符串被污染,则有sql注入。这些功能的细节将在后面介绍


Ref:

在Java中,可以通过使用
PreparedStatement
s和参数化查询来防止SQL注入,因为
PreparedStatement
会转义不安全的字符,从而使注入攻击无害。Hibernate的参数化查询和条件查询使用
PreparedStatement
s,因此您可以立即获得SQL注入保护。你唯一不安全的时候是当你试图像第一个例子中那样手工编写代码查询时。在我的例子中,数字5可能是不安全的。如果我从post中得到5,我需要做什么,例如排除“5和1=1”,这将自动转义,无需担心。为了说服自己,运行一个测试并确保不会得到意外的结果。我在我的一个示例应用程序中添加了一个(
testSQLInjection
方法)来检查对SQL注入攻击的保护。如果SQL注入成功,此测试将失败,因为使用恶意输入的第二个查询将返回受影响数据库表中的所有行。测试通过的事实证明,第二个查询返回的结果为零,如果输入在发送到数据库之前已正确转义,则应返回零结果。谢谢。将运行它。:)。你们为什么不把你们的密码贴在下面,这样我就可以接受你们的答案了。