【发布时间】:2015-09-27 15:14:34
【问题描述】:
我正在使用 Hibernate,我知道您可以使用 HQL 防止 SQL 注入:
String query1 = "from Obj where id = "+ id;
String query2 = "from Obj where id = :id";
query1 是不安全的,而query2 是安全的。
如何使用 Criteria 实现安全查询?这是否已经实施,还是我必须做其他事情?
Criteria c = session.createCriteria(Obj.class);
c.add(Restrictions.eq("id", 5));
【问题讨论】:
-
可以通过使用
PreparedStatements 和参数化查询在Java 中防止SQL 注入,因为PreparedStatement会转义不安全的字符,从而使注入攻击无害。 Hibernate 的参数化和标准查询使用PreparedStatements,因此您可以获得开箱即用的 SQL 注入保护。唯一不安全的情况是当您尝试像第一个示例中那样手动编写查询代码时。 -
在我的示例中,编号 5 可能不安全。如果我从帖子中得到 5,我需要做什么,例如排除“5 和 1 = 1”
-
这会自动转义,不用担心。要说服自己,请运行测试并确保不会得到意外结果。
-
我在我的示例应用程序中添加了一个test case(
testSQLInjection方法)来检查对 SQL 注入攻击的保护。如果 SQL 注入有效,此测试将失败,因为使用恶意输入的第二个查询将返回受影响数据库表中的所有行。测试通过的事实证明第二个查询返回零结果,如果输入在发送到数据库之前被正确转义,这是预期的。 -
谢谢。会运行它。 :)。你为什么不把你的代码贴在下面,这样我就可以接受答案了。
标签: hibernate hibernate-criteria nhibernate-hql