Security Hibernate安全顾虑:Hibernate与存储过程

Security Hibernate安全顾虑:Hibernate与存储过程,security,nhibernate,hibernate,stored-procedures,Security,Nhibernate,Hibernate,Stored Procedures,在我工作的公司,我们经常需要与客户的基础设施集成。 最近,在听说我们使用Hibernate之后,一个客户机表现出以下担忧:因为Hibernate连接到数据库的用户直接访问表,Hibernate动态生成SQL,所以这样的用户可以在数据库中做很多事情 如果用户只有执行存储过程的权限,那么SPs可以限制数据,但更重要的是可以向数据库发出的查询类型:基本上没有动态和注入的SQL。因此,如果有一个消除一行的存储过程,那么持有用户凭据的恶意用户将能够一次性消除一行,但无法发出DELETE*。我知道Hiber

在我工作的公司,我们经常需要与客户的基础设施集成。 最近,在听说我们使用Hibernate之后,一个客户机表现出以下担忧:因为Hibernate连接到数据库的用户直接访问表,Hibernate动态生成SQL,所以这样的用户可以在数据库中做很多事情

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


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

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

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

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

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

  • NHibernate可以映射到存储过程而不是表
  • 如果愿意,可以将读取操作映射到表/视图,并将插入/更新/删除操作映射到存储过程
  • NHibernate不会生成参数化SQL,即不存在SQL注入的可能性
  • 如果决定映射到表和/或视图,则用户权限始终可以限制为对某些表执行某些操作
  • 大多数使用存储过程的项目一开始都是为每个表生成CRUD过程,并为它们分配执行权限——这实际上并不比允许表访问更安全
  • NHibernate可以映射到存储过程而不是表
  • 如果愿意,可以将读取操作映射到表/视图,并将插入/更新/删除操作映射到存储过程
  • NHibernate不会生成参数化SQL,即不存在SQL注入的可能性
  • 如果决定映射到表和/或视图,则用户权限始终可以限制为对某些表执行某些操作
  • 大多数使用存储过程的项目一开始都是为每个表生成CRUD过程,并为它们分配执行权限——这实际上并不比允许表访问更安全

  • Hibernate当然只是sql上的ORM层


    在上添加show_sql=true属性,向他们显示正在生成的sql,他们将确切地看到它的作用(前面提到的参数化查询)

    当然,Hibernate只是sql上的ORM层

    在上添加show_sql=true属性,向他们显示正在生成的sql,他们将确切地看到它的作用(前面提到的参数化查询)

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

    在实践中,根据我的经验,以一种有意义的方式实现这种类型的安全性是极其罕见的。如果为每个CRUD操作编写了一个存储过程,并且向用户授予了对所有存储过程的访问权,那么这与仅向底层结构本身授予权限没有什么实际区别

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

    可以在存储过程上使用Hibernate,但是。

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

    在实践中,根据我的经验,以一种有意义的方式实现这种类型的安全性是极其罕见的。如果为每个CRUD操作编写了一个存储过程,并且向用户授予了对所有存储过程的访问权,那么这与仅向底层结构本身授予权限没有什么实际区别

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


    可以在存储过程上使用Hibernate,但是。

    True,Hibernate可以在与任何其他数据库访问技术相同的限制下运行。用户只有在开发人员为他们留下一个窗口的情况下才能造成损害。我最初没有说明这一点,但想法是使用香草Hibernate。重写应用程序以使用SPs或参数化查询,或将Hibernate与这两种技术结合使用,成本太高,这正是我希望避免的。没错,Hibernate可以在与任何其他数据库访问技术相同的限制下运行。用户只有在开发人员为他们留下一个窗口的情况下才能造成损害。我最初没有说明这一点,但想法是使用香草Hibernate。重写应用程序