像 Hibernate 这样的 ORM 框架是否可以完全缓解 SQL 注入?

信息安全 应用安全 sql注入 对策 休眠
2021-08-31 21:24:59

我知道要防止所有或大多数 SQL 注入攻击,您应该使用参数化查询。我使用 Hibernate 已经有一段时间了,而不是手写我的 SQL 语句。是否有任何已知的攻击或研究旨在利用这一层?

3个回答

不,你不是自动安全的。
SQL 注入仍然可以存在。

OWASP 页面

SQL注入注意事项

由于它是热门话题,我现在将讨论它,但稍后会详细讨论。

  • Hibernate 不授予对 SQL 注入的免疫力,人们可以随意滥用 api。
  • HQL(SQL 的 Hibernates 子集)并没有什么特别之处,这使其或多或少容易受到影响。
  • createQuery(String query) 和 createSQLQuery(String query) 等函数创建一个 Query 对象,该对象将在调用 commit() 时执行。如果查询字符串被污染,则您有 sql 注入。稍后将介绍这些函数的详细信息。

除了其他答案之外,ORM 可能无济于事的一个领域是 ORM 代码本身存在问题。例如,在某些版本的 Rails 中,ActiveRecord 存在一些问题,其中 SQL 注入位于框架本身而不是用户创建的代码中。

也就是说,正确使用 ORM 确实可以更轻松地避免 SQL 注入,因此与手工制作查询相比,这是一个很好的说服策略。

在这篇文中,有一个使用 nHibernate 的 CreateSQLQuery 的示例代码,该代码容易受到 SQL 注入的攻击,以及在 ORM 框架中使用参数化查询编写相同查询以避免注入的适当方法。归根结底,无论您如何创建 SQL 查询,使用字符串连接或 ORM 来处理作为对象和属性的输入,如果您创建动态查询,注入的 SQL 代码都可以在数据库中执行。但是如果你参数化它,你就是告诉数据库一个“选择”或“插入”查询,例如这两个输入,即使输入包含一些 SQL 代码,数据库也不会执行它们。