【发布时间】:2011-07-07 13:51:58
【问题描述】:
在使用 ORM(实体框架、LINQ to SQL、NHibernate ...)时,是否可以通过设计缓解 SQL 注入攻击?
如果没有,我应该在哪里做一些额外的验证/清理以防止漏洞?
【问题讨论】:
-
如果不是,它们就是一个非常糟糕的 ORM。
标签: nhibernate entity-framework orm sql-injection
在使用 ORM(实体框架、LINQ to SQL、NHibernate ...)时,是否可以通过设计缓解 SQL 注入攻击?
如果没有,我应该在哪里做一些额外的验证/清理以防止漏洞?
【问题讨论】:
标签: nhibernate entity-framework orm sql-injection
大多数(如果不是全部)主流 ORM 使用参数化 SQL,这将保护您免受直接 SQL 注入攻击。然而,应用层的参数化 SQL 并不能保护您免受潜在的 SQL 注入攻击。当 ORM 之外的某些东西直接连接 SQL 语句中的用户输入(例如连接用户输入以创建非参数化动态查询的批处理运行存储过程)时,就会发生这种情况。请注意,这根本不是 ORM 问题,但我想我要指出的是,参数化 SQL 只有在无处不在的情况下才能保护您免受注入,而不仅仅是在 ORM 中。
【讨论】:
它们在 NHibernate 中使用参数化查询。
【讨论】:
在基本概念中,ORM 被设计为安全的。大多数时候您不必担心,但如果您认为自己可能会面临真正的破解,您应该进行一些自定义调整。
对于简单的应用程序,简单的 SQL 注入将涵盖在内。在安全和 SQL 注入问题上,没有任何机构(说真的,从来没有机构)会给您灵丹妙药。这是我的建议。
【讨论】:
ORM 通常使用大量动态 SQL,这是不安全的,因为它使应用程序和/或服务帐户的用户能够执行即席 SQL 查询。正确的解决方案是只有程序员和数据库管理员拥有 DataReader/DataWriter 和所有接触数据库的程序,除了参数化的存储过程之外什么都不使用,始终没有与程序关联的 DataReader/DataWriter 访问。他们只能访问我说他们可以访问的 SP。只有数据库管理员和程序员才能执行临时 SQL 查询。
【讨论】: