代码之家  ›  专栏  ›  技术社区  ›  Dan

休眠安全担忧:休眠与存储过程

  •  1
  • Dan  · 技术社区  · 15 年前

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

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

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

    5 回复  |  直到 15 年前
        1
  •  7
  •   John Rayner    15 年前
    1. NHibernate可以映射到存储过程而不是表
    2. 如果愿意,可以将读取操作映射到表/视图,并将插入/更新/删除操作映射到存储过程
    3. nhibernate确实会生成参数化的SQL,即不存在SQL注入的机会。
    4. 如果您决定映射到表和/或视图上,则用户权限始终可以限制为某些表上的某些操作。
    5. 大多数使用存储过程的项目都是从为每个表生成CRUD过程并为所有表分配执行权限开始的-这并不比允许表访问更安全。
        2
  •  1
  •   Chrisb    15 年前

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

        3
  •  0
  •   dionysus55    15 年前

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

        4
  •  0
  •   lucas    15 年前

    当然,Hibernate只是SQL上的一个ORM层。

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

        5
  •  0
  •   Chris McCall    15 年前

    冬眠 可以 与使用存储过程相比,DBA的安全性要低一些,因为理论上,DBA可以限制用户只访问调用存储过程,而不是直接访问基础数据结构。

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

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

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