2009-09-09 101 views
1

在我与之合作的公司中,我们经常需要与客户端的基础架构进行集成。最近,在听说我们使用Hibernate之后,一个客户端表现出以下担忧:由于Hibernate连接到数据库的用户可以直接访问表并且Hibernate动态地生成SQL,因此这样的用户可以在数据库中执行任何操作。休眠安全理解:休眠与存储过程

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

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

+0

为什么不创建视图,然后使用它们的授予权限来防止删除?这个问题似乎与Hibernate/NHibernate没有任何关系。 –

+0

http://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt – mxmissile

回答

7
  1. NHibernate的可以映射到存储过程,而不是表
  2. 可以映射读取操作到表/视图,插入/更新/删除操作上,如果你喜欢
  3. NHibernate的不生成参数化的SQL存储过程,也就是说,没有SQL注入的机会,如果你决定通过生成CRUD方法为每个表,并分配给映射到表和/或视图
  4. 使用存储过程的大多数项目开始
  5. 用户权限总是可以限制对某些表的某些操作,执行第所有的错误 - 这并不比访问表的访问更安全
+1

很好的答案。这是NHibernate开发人员为DBA想要锁定数据库的场景所建议的。 http://ayende.com/Blog/archive/2006/10/04/ShouldYouUseNHibernateWithStoredProcedure.aspx –

1

我假设Hibernate使用参数化查询。这应该可以缓解SQL注入的许多问题。您还可以防止用户帐户能够完成数据库中的所有操作。毕竟,它不需要成为SA账户。

+0

确实,hibernate可以在与其他数据库访问技术相同的限制下运行。如果开发者离开了他们这样做的窗口,用户将只能造成损害。 – Zoidberg

+0

我最初没有说过,但是我们的想法是使用vanilla Hibernate。重写应用程序以使用SP或参数化查询或Hibernate与两者结合使用会太昂贵,而且正是我希望避免的。 – Dan

0

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

0

Hibernate当然只是一个ORM层over SQL。

在上面添加show_sql = true属性,向他们展示正在生成的是什么sql,并且他们将完全看到它的作用(参数化查询如前所述)。

0

休眠可以比使用存储过程安全,因为从理论上讲,DBA可以限制用户访问只调用存储过程,而不是直接访问底层数据结构。

在实践和我的经验中,这种安全方式以有意义的方式实现是极为罕见的。如果存储过程是为每个CRUD操作编写的,并且用户被授予对所有存储过程的访问权限,那么它们之间没有真正的区别,只是授予底层结构本身的权限。

如果公司对SOX或安全合规性进行审计,他们可能会因没有使用存储过程而被拒绝。

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

+0

一个区别是恶意用户将无法执行批量删除,或者为了避免将一行写入日志表,如果写入在Hibernate中实现,而不是作为Db中的触发器。 – Dan

+0

恶意用户将无法执行批量删除,除非您的应用进行批量删除。一个绕过应用程序并使用应用程序使用的相同证书直接连接到数据库的恶意黑客可能会这样做,但这意味着您要么将数据库服务器从任何地方开放到连接,要么您的应用程序服务器已被入侵 - 在这种情况下,您遇到的问题不仅仅是批量删除。 –

+1

@Dan:“批量删除”和编写一个在循环中运行DELETE sp的程序之间有什么区别,删除所有记录,除了执行时间和黑客的一点不便之处? –