【问题标题】:Hibernate Security Apprehension: Hibernate vs. Stored ProceduresHibernate 安全担忧:Hibernate 与存储过程
【发布时间】:2010-11-26 22:16:44
【问题描述】:

在与我合作的公司,我们经常需要与客户的基础架构集成。 最近,听说我们使用Hibernate后,有一个客户表示担心:由于Hibernate连接数据库的用户可以直接访问表,而Hibernate动态生成SQL,那么这样的用户可以在数据库中做相当多的事情。

如果用户只有执行存储过程的权限,那么 SP 可以限制数据,但更重要的是他可以向数据库发出的查询类型:基本上没有动态和注入的 SQL。因此,如果有一个删除行的存储过程,获取用户凭据的恶意人员将能够一次性删除一行,但无法发出 DELETE *。我知道 Hibernate 也可以映射视图,但这再次限制了数据,而不是用户可以执行的操作。 Hibernate 也可以执行 SP,但这在很大程度上超出了使用 Hibernate 的目的,并且意味着对应用程序的完全重写。

虽然我不认为这是一个主要问题,但由于应用程序服务器也提供安全性,我在说服客户方面遇到了问题。你对此有何看法? Hibernate 真的不如使用存储过程的应用程序安全吗?使用 Hibernate 时可以采取哪些额外的安全措施?

【问题讨论】:

标签: security nhibernate hibernate stored-procedures


【解决方案1】:
  1. NHibernate 可以映射到存储过程而不是表
  2. 如果愿意,您可以将读取操作映射到表/视图,并将插入/更新/删除操作映射到存储过程
  3. NHibernate 确实会生成参数化 SQL,即没有 SQL 注入的机会
  4. 如果您决定映射到表和/或视图上,用户权限始终可以限制为对某些表的某些操作
  5. 大多数使用存储过程的项目都是从为每个表生成 CRUD 过程并为所有表分配执行权限开始的 - 这并不比允许表访问更安全

【讨论】:

【解决方案2】:

我假设 Hibernate 使用参数化查询。这应该可以减轻对 SQL 注入的大部分担忧。您还可以阻止用户帐户执行数据库中的所有操作。毕竟不需要是SA账户。

【讨论】:

  • 没错,hibernate 可以在与任何其他数据库访问技术相同的限制下运行。用户只有在开发者留出一个窗口让他们这样做时才能造成损害。
  • 我最初并没有说明这一点,但想法是使用香草Hibernate。重写应用程序以使用 SP 或参数化查询或 Hibernate 将两者结合起来成本太高,这正是我希望避免的事情。
【解决方案3】:

如果我没记错的话,NHibernate 使用参数化的 sql 查询。这将停止注射。

【讨论】:

    【解决方案4】:

    Hibernate 当然只是 sql 之上的 ORM 层。

    添加 show_sql=true 属性,向他们展示正在生成什么 sql,他们将确切地看到它的作用(如前所述的参数化查询)。

    【讨论】:

      【解决方案5】:

      Hibernate 可能不如使用存储过程安全,因为理论上,DBA 可以将用户访问限制为仅调用存储过程,而不是直接访问底层数据结构。

      在实践中和我的经验中,这种安全风格以有意义的方式实施的情况极为罕见。如果为每个 CRUD 操作编写一个存储过程,并且授予用户对所有存储过程的访问权限,那么这与仅授予对底层结构本身的权限没有真正的区别。

      如果公司接受了 SOX 或安全合规性审计,他们可能会因为不使用存储过程而受到批评。

      可以通过存储过程使用 Hibernate,但 it seems like a pain in the ass

      【讨论】:

      • 一个区别是恶意用户将无法执行批量删除,或者如果此类写入是在 Hibernate 中实现而不是作为 Db 中的触发器,则无法绕过将行写入日志表。
      • 除非您的应用进行批量删除,否则恶意用户将无法执行批量删除。绕过您的应用程序并使用您的应用程序使用的相同凭据直接连接到数据库的恶意黑客可能能够做到,但这意味着您要么让您的数据库服务器对来自任何地方的连接保持开放,要么您的应用程序服务器已被入侵 -在这种情况下,您遇到的问题不仅仅是批量删除。
      • @Dan:“批量删除”和编写一个在循环中运行 DELETE sp 的程序,删除所有记录,除了执行时间和对黑客的一点点不便,有什么区别?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 2011-04-10
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多